1. 程式人生 > >noip2016提高&普及組簡要題解

noip2016提高&普及組簡要題解

提高組

兩天的難易程度都是1-3-2

Day1

toy

亂搞模擬

running

首先對於一個人(s,t),我們把這條路徑拆分為(s,lca)與(lca,t),其中lca為s與t的最近公共祖先
先看(s,lca)這一類,對於一個節點x,一個x的子樹中的節點y,只要滿足d[y]d[x]=w[x]且x是lca(s,t)的子樹中的點,那麼ans[x]++.
d[y]d[x]=w[x]
d[y]=w[x]+d[x]
現在成了一個經典的問題: 在x的子樹中存有多少個d[y]
但注意到如果路徑(s,t)在x的子樹中但不經過x,ans[x]是不能+1的,所以對於路徑(s,lca),我們分別在s與lca打一個+d[y]與-d[y]的標記.然後dfs一遍統計答案.因為對於節點x我們只關心一個值,所以開始時記錄一下值,返回時減掉就是x的子樹中新增的值.
對於(t,lca)同理,需要注意的是特判lca也能觀察到的情況.

classroom

首先我們不難發現,這個期望值是可以相加的.即上完第i節課所用的期望值加上從第i節課的課室到第i+1節課的課室的期望就等於上完第i+1節課的期望.因為他們是互不影響的.
然後這就變成了一道很簡單的dp.

day2

problem

楊輝三角形+矩陣字首和預處理,O(1)回答詢問.

earthworm

首先暴力就是打一個堆,然後維護堆內的值全部與真實值差i*q
q=0的做法就是有每一次分解出來的x和y都會比下一次的x和y的大.所以維護一個連結串列兩個指標處理插入就OK了.
然後正解就是合併一下,維護連結串列中的值全部與真實值差i*q.分解出來的x,y減掉i*q後依舊是單調不增的

angrybirds

狀壓DP.
首先n^3處理出Gi,j表示打i和j這一條拋物線的時候能順帶打下多少,壓起來.
然後還能發現就是無論如何總要打掉第一個沒被打掉的,那就在當前這一次打掉.
然後就是2^n*n^2的DP了.

普及組

T1,T2不說了 (雖然打完就交都只有70分)

T3

簡單模擬一下,用一個指標維護一天內的人,再開一個桶維護人數.

T4

設d-c=x,那麼b-a=2x
然後c-b>6x
然後列舉x,O(n)預處理一下c+d=x的組數,再列舉a,計算ansa,ansb.再列舉d,計算ansc,ansd.
這樣就是O(n^2)的暴力,能有95分.
對於最後一個點,我們觀察發現x最大能取到n/9.