TJOI2019 甲苯先生的線段樹(數字DP)

2021-09-28 11:17:26 字數 3480 閱讀 9447

tjoi2019難一點的就只有這道d2t3了,前面五道我共計花了三個小時,這一道花了將近兩個小時。五個小時ak兩天tjoi不是夢

但是說實話這道題並沒有什麼水平,沒考察什麼思維方面的東西,涉及到的性質也極其偏門,天津就靠這個來選拔省隊?怕不是反向選拔,反正天津今年也一塊金牌也沒有,這個鍋省選和省選出題人肯定背定了。

然後我去題解區逛的時候還看到這居然是cf750g?而且還是沒有什麼改動的版本?天津省選出題人恐怕是在騙錢哦。所以唯一有「可能」有區分度的題就這樣送給了做過這場cf比賽的人?

我記得某位前金牌oier,現出題人說過:當我意識到我出的題可能會影響到別人的一生的時候,我只會過分慎重。

原話是什麼我忘了,反正大概就是這個意思。

呵呵,這就是天津省選出題人的責任心?真是令人 [資料刪除]

本人不在天津,以上發言利益無關。只是見到這麼水的省選想把出題人拖出來按在地上爆錘而已。

為天津被這場板子題省選送退役的選手感到惋惜。

還說cqoi2018是板子題考試?起碼該拿金牌的選手cq確實選進省隊了。

首先對於樹上距離顯然直接找到lca。

考慮點x

xx到根的標號和,對於每乙個位求一下和發現就是2⋅x

−pc(

x)

2\cdot x-pc(x)

2⋅x−pc

(x),其中pc(

x)

pc(x)

pc(x)是x

xx的二進位制表示中1

11的個數。

第一問就此解決,設第一問答案為s

ss,現在考慮第二問。

現在需要考慮在不超過深度d

dd的點對中有多少對能夠搞到sss。

然後這道題就真的沒什麼意思了,嘗試從各種角度列舉。

如果你運氣足夠好或者直覺足夠準確,你會想到列舉左右鏈長度。

然後是乙個更加扯淡的性質,確定了左右鏈長度之後,lca就確定了。

設l ca

lcalc

a為pp

p,左鏈長度為a

aa,右鏈長度為b

bb,則我們把lca單獨的貢獻算一下,是:(p+

2p+4

p+⋯+

2ap)

+(p+

2p+4

p+⋯+

2bp)

−p=(

2a+1

+2b+

1−3)

p(p+2p+4p+\cdots +2^ap)+(p+2p+4p+\cdots +2^bp)-p=(2^+2^-3)p

(p+2p+

4p+⋯

+2ap

)+(p

+2p+

4p+⋯

+2bp

)−p=

(2a+

1+2b

+1−3

)p然後考慮在定了lca

lcalc

a和左右鏈長度之後,我們決定每一位走左右兒子能夠得到的最大最小值,顯然除了右鏈第一步必須走右兒子,左鏈第一步必須走左兒子以外,剩下的可以貪心向最大值最小值靠攏。那麼根據走左右兒子變化的增量在[2b

−1,2

a+2b

+1−a

−b−3

][2^b-1,2^a+2^-a-b-3]

[2b−1,

2a+2

b+1−

a−b−

3]之間。那麼就完蛋了,增量的最大值甚至比2a+

1+2b

+1−3

2^+2^-3

2a+1+2

b+1−

3也就是前面lca

lcalc

a貢獻的係數還要小,那麼lca

lcalc

a為pp

p的情況的最大值比p+1

p+1p+

1的情況的最小值還小,也就是說在鏈長確定了之後,lca確定的各個情況值域不相交。

所以如果要達到s

ss,lca一定是確定的,就是⌊s2

a+1+

2b+1

−3

⌋\lfloor\frac+2^-3}\rfloor

⌊2a+1+

2b+1

−3s​

⌋。這時候把lca看做根,把s

ss減掉lca的貢獻和右鏈第一步走右兒子的貢獻,設這個值為w

ww,那麼我們就是要求有多少個合法的x,y

x,yx,

y,使得2∗x

+2∗y

−pc(

x)−p

c(y)

=w

2*x+2*y-pc(x)-pc(y)=w

2∗x+2∗

y−pc

(x)−

pc(y

)=w,列舉pc(

x)+p

c(y)

=z

pc(x)+pc(y)=z

pc(x)+

pc(y

)=z,則問題就是2x+

2y=w

+z

2x+2y=w+z

2x+2y=

w+z,且x,y

x,yx,

y二進位制中1

11的總數為z

zz,x,y

x,yx,

y分別不超過自己鏈的上界。

顯然這個東西可以直接一發數字dp搞定。

**:

#include

#define ll long long

#define re register

#define cs const

#define pc __builtin_popcountll

using std::cerr;

using std::cout;

cs int n=55;

ll dp[2]

[n][n<<1]

;inline ll solve

(ll sum,ll cb,ll b1,ll b2)

}return dp[0]

[mxb-1]

[cb];}

inline ll lca

(ll x,ll y)

inline ll calc

(ll x)

inline

void

solve()

for(

int re i=

0;i++i)

for(

int re j=

0;j++j)

if(l+i>d||l+j>d)

continue

; ll k=s%ss-

(1ll

<;if

(k<0)

continue

;int cb=i+j;

for(

int re t=k&

1;t<=cb;t+=2

) ans+

=solve

(k+t,t,i,j);}

cout<1<<

"\n";}

signed

main()

TJOI2019 甲苯先生的線段樹

tjoi2019 甲苯先生的線段樹 首先原題 cf750g new year and binary tree paths 方法 滿二叉樹,鏈長為logn 考慮列舉lca為x,兩個鏈長h1,h2,發現x是唯一確定的!找到這個x,s減去都走左兒子的貢獻,再調整出右兒子 2 n 1 2 n,變成每一位的0...

TJOI2019 平衡樹 甲苯先生的滾榜

描述 甲苯先生在製作乙個online judge,他發現做比賽的人們很關心自己的排名 顯而易見 在acm賽制的比賽中,如果通過題目數量不相等,則通過題目數量多的人排名更靠前,如果通過題目數量相等,則罰時更少的人排名更高。甲苯先生想讓大家幫忙設計乙個程式,每次有人通過之後,就告訴他排名在他的前面有多少...

TJOI2019 甲苯先生和大中鋒的字串

有個叫asuldb的神仙來嘲諷我 說這題sam水題,而且sa過不了 然後我就用sa過了 顯然是乙個height陣列上長為k的滑塊,判一下兩邊,差分一下就可以了 include cstdio include cstring include iostream include algorithm usin...