THUPC2019/CTS2019/APIO2019/PKUSC2019游記


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個小時就可以寫完,所以要多想。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM