中鋪,火車好晃啊node
打了THUPC2019的練習賽,華容道好評(四個小兵,槓鴨!)ios
打了THUPC2019api
開場爆了好幾發D,而後不想寫,丟給ZCY,cerr竟然wa了好多發優化
而後ZCY看出B是sb題,咱們倆不想寫,丟給ZCYspa
而後gmy和我分別寫了M和J兩個簽到題,三人開始分別開C,I,Lcode
ZCY丟給我一個\(O(m)\)的式子讓我優化,我推了推以後發現k才20排序
你容斥是\(O(k^2)\)的又不是\(O(2^k)\)的你優化這個幹嗎string
而後我寫容斥部分,他寫組合數部分,交上去,WA ???it
woc這個模數過小了可能沒逆元啊,而後改改改改改,交上去,過了io
此時gmy的I已經會了,可是咱們倆又沒人想寫,依然丟給ZCY
寫完一直WA,交暴力也WA
咱們都在噴卡精的時候交了一發puts("nan");
而後過了,良心SPJ,最後rk36滾粗了
而後是講評環節,廣告倆小時,講題???不會的仍是不會
高調三人南,點了zcy的大三元,體驗被飛的快感
晚上到賓館才發現I題讀入搞錯了,我是傻逼
回去以後改了L和K。
在食堂裏看到了rvalue,剛想打招呼就不見了QAQ,還好在考場旁又遇到了
而後打了CTS2019Day 1
玩題答3h+倆暴力
出來一看分數還行
orz \(\color{red}{\mathrm{Itst}}\) 切t2
打了CTS2019Day 2
寫了30+10+0
一當作績10+10+0
傻逼了,打鐵滾粗了,凸包都能寫錯。
緣由大概是我把左下角那個基準點也丟進去排序了吧
這都能領獎,仍是個ag,不虧
吃頓神仙火鍋平均一人90rmb,嚇尿了
lzh來了,氣氛忽然變得?了起來
而後我被拉入lol坑
上午講厲害東西徹底聽不懂,直接致使我下午去都沒去。
打了APIO2019,自閉了
開場寫完仨暴力,開始搞t1(device),想了想好像挺傻逼的。
就是拆環作區間覆蓋就好了。
我寫了5k特判,而後由於有四個模數(A,B,B+1,A/gcd(A,B+1)),調不出來了。
最後20+43+60滾粗了。
出來一問你們都203,txc聚聚更是提早2小時ak離場
那我墊底穩了啊
上午又講厲害東西,不過感受比前天那個好玩?
晚上頒獎,我竟然還有塊Cu,不虧不虧
這下noi賽事的三個牌牌都齊了,就剩noi2019去打鐵了(霧)
忘記幹啥了
複習
全世界只有我在北京還沒去tho,甚至連live party都去不上.jpg
下午打了PKUSC2019Day1
看t1,好像是個逆序對傻逼題
看t2,好像是個厲害題
看t3,好像仍是個傻逼題
先寫t3,對每一個點搞出來61個數而後判加和是否能組成就好了吧
搞了個bitset優化揹包,拿了60分 感受再卡卡常就能過了(flg)
而後寫t1,寫個主席樹上去就過了,此時不過1h,感受很穩(flg)
開始剛t3,寫了這麼個亂搞:
跑得飛快啊,直接2.幾s
而後又yy出一個能使常數減半的作法,不過須要手寫bitset控制位數= =
因而我就打開自帶的mingw開始看裏面的bitset
看了一個小時左右,忽然意識到本身在考試,好像浪費一個小時不是很值(很傻逼)
看看t2吧,想了好長時間才發現能夠枚舉一個點
枚舉一個點,把小於的視爲0,大於的視爲2,0022之間不影響。
而後狀態數就很是少了,寫了一發卡了卡常就過了。
回去卡t3,加了好多玄學優化(到最後也沒手寫bitset)
忽然發現最後一個點艹過去了(1992ms),而後第一個點wa了???不過還好取最高還有93分..
把第一個點特判掉以後就過不去最後一個點了(20xxms),感受評測機上下浮動很正常,那我多交幾發就過了(flg)。
而後32發交到最後,流局了
提早出考場僞裝ak還行
問羣裏大佬,好多都提早2h ak啊
這個t3只要在trie樹上作就行了啊,有用的點一共n個,按深度存log個bitset就好了,wtcl這都想不到。
明天繼續加油QAQ
看題,woc三個樹題,要爆零了
看t1,寫完n^2的dp以後看了看鏈的作法,而後就會了正解
一開始寫了個線段樹合併而後發現並不能標記下傳時新建節點,此時1h過去了QAQ
想着換成線段樹啓發式合併或者splay啓發式合併能好寫一點,先去看t2t3
看t2,只會8分
看t3,看了很久纔看明白弦圖是啥玩意,暴力不會打,告辭
只能去寫t1啦,這個t1好像能夠每次只維護子樹內有限制的顏色集合,這樣標記下傳時不用新建節點比較妙,寫一半發現個人作法在求點積的時候須要先乘再除,而後乘0就GG了,判掉乘0以後已經又過了2h。
交一發,AcAcWaTle ,這啥玩意啊
發現m的範圍好像不是2e5是1e9啊,那我空間還得再開大一點..誒怎麼就mle了。
在想要不要換成splay啓發式合併來優化空間和時間(此時已經把一開始的線段樹合併扔掉了QAQ)
想了想仍是算了,打暴力吧,這題過的人應該很少(flg)
而後玩t2二叉樹的分..,寫了個暴力發現這個\(m=\lceil n/4\rceil\),求出\(m\)以後直接搜就搜出來答案了。
那後面的點應該也是這樣作吧,就開始猜這個\(m\)是什麼,而後沒猜出來涼了
最後0.5h剛t3,感受應該能找找規律,而後發現線弦圖必定不存在長度大於等於4的環,寫寫寫暴力,沒調出來,滾了。
出來問成績,好多大佬說今天比昨天簡單???
47+49+0=96,被高一的ysy和gmy吊打50分,怎麼人均切t1t2啊QAQ
而後又據說有好多人600... 我今天成功被區分了
聽大佬講題,t1作法都同樣只是我調不出來別人能調出來,t2那個m其實就是鏈覆蓋(葉子個數/2), t3注意到結論以後變成樹上dp,每次乘一個兩項的多項式,用分治fft便可。
頒獎頒獎
拿了個二等跑路
給高二的獎好少啊
初三和高二的一等獎線大概差了200分
在火車上寫d2t1的線段樹合併,甚至比啓發式合併好寫??徹底不用處理乘0的狀況
#include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <cmath> #include <vector> #include <iostream> using namespace std; typedef long long ll; #define mod 998244353 #define N 400050 #define M 20000050 #define db(x) cerr<<#x<<" = "<<x<<endl #define fov(i,x) for(i=0;i<(int)x.size();i++) ll qp(ll x,ll y=mod-2) {ll re=1;for(;y;y>>=1,x=x*x%mod)if(y&1)re=re*x%mod; return re;} int head[N],to[N],nxt[N],cnt,n,m,K; int ls[M],rs[M],tot,siz[M]; int sum[M],tag1[M],tag2[M]; vector<int>V[N]; struct node { int rt; ll O,s; void gs() { s=(sum[rt]+(m-siz[rt])*O)%mod; } }tr[N]; node X,Y; inline void add(int u,int v) {to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;} inline void giv1(ll v,int p) { if(!p)return ; sum[p]=sum[p]*v%mod; tag1[p]=tag1[p]*v%mod; tag2[p]=tag2[p]*v%mod; } inline void giv2(ll v,int p) { if(!p)return ; sum[p]=(sum[p]+siz[p]*v)%mod; tag2[p]=(tag2[p]+v)%mod; } inline void pushdown(int p) { if(tag1[p]!=1||tag2[p]) { giv1(tag1[p],ls[p]); giv2(tag2[p],ls[p]); giv1(tag1[p],rs[p]); giv2(tag2[p],rs[p]); tag1[p]=1; tag2[p]=0; } } inline void pushup(int p) { sum[p]=(sum[ls[p]]+sum[rs[p]])%mod; siz[p]=siz[ls[p]]+siz[rs[p]]; } void update(int l,int r,int x,int &p) { if(!p) { p=++tot; tag1[p]=1; siz[p]=1; } if(l==r) { sum[p]=0; return ;} int mid=(l+r)>>1; pushdown(p); if(x<=mid) update(l,mid,x,ls[p]); else update(mid+1,r,x,rs[p]); pushup(p); } int merge(int l,int r,int x,int y) { if(!x&&!y) return 0; if(!y) { giv1(Y.O,x); return x; } if(!x) { giv1(X.O,y); return y; } if(l==r) { sum[x]=(sum[x]*sum[y])%mod; return x; } int mid=(l+r)>>1; pushdown(x); pushdown(y); ls[x]=merge(l,mid,ls[x],ls[y]); rs[x]=merge(mid+1,r,rs[x],rs[y]); pushup(x); return x; } void dfs(int x,int y) { int i; tr[x].O=1; fov(i,V[x]) update(1,m,V[x][i],tr[x].rt); for(i=head[x];i;i=nxt[i]) if(to[i]!=y) { dfs(to[i],x); X=tr[x], Y=tr[to[i]]; tr[x].rt=merge(1,m,tr[x].rt,tr[to[i]].rt); tr[x].O=tr[x].O*tr[to[i]].O%mod; } tr[x].gs(); ll s=tr[x].s; if(x!=1) { tr[x].O=(s-tr[x].O)%mod; giv1(mod-1,tr[x].rt); giv2(s,tr[x].rt); } } int main() { scanf("%d%d%d",&n,&m,&K); int i,x,y; for(i=1;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x); for(i=1;i<=K;i++) scanf("%d%d",&x,&y),V[x].push_back(y); dfs(1,0); printf("%lld\n",(tr[1].s+mod)%mod); }