THUPC2019/CTS2019/APIO2019/PKUSC2019游記
5.10
中鋪,火車好晃啊
5.11
打了THUPC2019的練習賽,華容道好評(四個小兵,杠鴨!)
5.12
打了THUPC2019
開場爆了好幾發D,然后不想寫,丟給ZCY,cerr居然wa了好多發
然后ZCY看出B是sb題,我們倆不想寫,丟給ZCY
然后gmy和我分別寫了M和J兩個簽到題,三人開始分別開C,I,L
ZCY丟給我一個\(O(m)\)的式子讓我優化,我推了推之后發現k才20
你容斥是\(O(k^2)\)的又不是\(O(2^k)\)的你優化這個干嘛
然后我寫容斥部分,他寫組合數部分,交上去,WA ???
woc這個模數太小了可能沒逆元啊,然后改改改改改,交上去,過了
此時gmy的I已經會了,但是我們倆又沒人想寫,依然丟給ZCY
寫完一直WA,交暴力也WA
我們都在噴卡精的時候交了一發puts("nan");
然后過了,良心SPJ,最后rk36滾粗了
然后是講評環節,廣告倆小時,講題???不會的還是不會
高調三人南,點了zcy的大三元,體驗被飛的快感
晚上到賓館才發現I題讀入搞錯了,我是傻逼
回去之后改了L和K。
5.13
在食堂里看到了rvalue,剛想打招呼就不見了QAQ,還好在考場旁又遇到了
然后打了CTS2019Day 1
玩題答3h+倆暴力
出來一看分數還行
orz \(\color{red}{\mathrm{Itst}}\) 切t2
5.14
打了CTS2019Day 2
寫了30+10+0
一看成績10+10+0
傻逼了,打鐵滾粗了,凸包都能寫錯。
原因大概是我把左下角那個基准點也丟進去排序了吧
5.15
這都能領獎,還是個ag,不虧
吃頓神仙火鍋平均一人90rmb,嚇尿了
5.16
lzh來了,氣氛突然變得?了起來
然后我被拉入lol坑
5.17
上午講厲害東西完全聽不懂,直接導致我下午去都沒去。
5.18
打了APIO2019,自閉了
開場寫完仨暴力,開始搞t1(device),想了想好像挺傻逼的。
就是拆環做區間覆蓋就行了。
我寫了5k特判,然后因為有四個模數(A,B,B+1,A/gcd(A,B+1)),調不出來了。
最后20+43+60滾粗了。
出來一問大家都203,txc聚聚更是提前2小時ak離場
那我墊底穩了啊
5.19
上午又講厲害東西,不過感覺比前天那個好玩?
晚上頒獎,我居然還有塊Cu,不虧不虧
這下noi賽事的三個牌牌都齊了,就剩noi2019去打鐵了(霧)
5.20
忘記干啥了
5.21 ~ 5.24
復習
5.25
全世界只有我在北京還沒去tho,甚至連live party都去不上.jpg
下午打了PKUSC2019Day1
看t1,好像是個逆序對傻逼題
看t2,好像是個厲害題
看t3,好像還是個傻逼題
先寫t3,對每個點搞出來61個數然后判加和是否能組成就行了吧
搞了個bitset優化背包,拿了60分 感覺再卡卡常就能過了(flg)
然后寫t1,寫個主席樹上去就過了,此時不過1h,感覺很穩(flg)
開始剛t3,寫了這么個亂搞:
- 當可用數字個數大於22時直接視為可行 (22是二分出來的)
跑得飛快啊,直接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
5.26
看題,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即可。
5.27
頒獎頒獎
拿了個二等跑路
給高二的獎好少啊
初三和高二的一等獎線大概差了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);
}
總結
- 一定要看清輸入格式
- 想到一個做法不要馬上實現,要多想想細節,如果細節太多就換做法,不要怕浪費時間,一個5個小時的比賽,去除掉碼量巨大的題,只需要2個小時就可以寫完,所以要多想。