1. 程式人生 > >NOIP2016提高組口胡題解

NOIP2016提高組口胡題解

來來來,讓我們來口胡一波

Day1

T1

直接模擬呀!下標都-1然後用%就好了

T2

本次比賽最難的一道題。
目前據我所知有三種演算法
首先,我們考慮轉化題目。
把鏈拆成兩條,一條向上,一條向下
如果一個點x,可以到達它的s在下面,那麼滿足dx+wx=ds
如果t在下面,那麼滿足dxwx=dtlent
其中len表示總長,d表示深度
發現左邊都是一個定值,右邊都只和s/t有關
那麼我們的問題就變成了求以一個點為根的子樹中有多少個權值為x的點
最暴力的想法就是直接線段樹合併+動態開點
複雜度O(N log N),常數有些大CCF老爺機。。。。

然後我們發現我們只關心某個子樹中一個值出現的次數。
那麼我們在dfs之前記錄一下這個值之前出現的次數,dfs後記錄一下
兩次相減就是我們要求的答案
lca用tarjan就可以做到O(N)

我用的方法比較辣雞
我們發現如果是鏈上的就可以O(N)解決,頭尾打上tag然後開個桶掃一遍就好了
現在上樹了呢?
那就鏈剖嘍
複雜度也是O(N log N),不過常數小一點,卡卡常就可以碾過去了

T3

首先最短路弗洛伊德(你想跑迪傑斯特拉加heap我不攔著你)
然後設Fi,j,0/1表示前i堂課,用了j次換課,且第i次換還是不換的最小期望長度
我們發現兩堂課之間的期望是獨立的,只和兩端的狀態有關,根據期望的線性我們可以直接把它加起來。
然後就隨便DP一下就好了。
還是需要卡常。。。

Day2

T1

楊輝三角求組合數%k,然後二維字首和

T2

首先可以把所有蚯蚓還原到0時刻的長度
注意先切掉的所分裂出來的蚯蚓一定比後切的分裂出來的要先切
於是開三個佇列,維護原來的蚯蚓,切掉的第一/二段
複雜度O(M)

T3

首先狀壓,暴力列舉兩個點求拋物線,暴力轉移2^N*N^3
預處理選兩個點能影響到的點,轉移2^N*N^2
發現我們的目標是全清,而且最優策略和順序無關,於是可以強制一定要打掉編號最小的那隻豬。
O(2^N*N)
發現這道題中有用的狀態不會太多。
而且狀態之間的轉移構成了一張DAG
那麼就直接bfs一遍求最短路就好了
O(玄學)
某Howar 打這個東西民間資料5ms大跳樓