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...