THUPC2019/CTS2019/APIO2019/PKUSC2019遊記

THUPC2019/CTS2019/APIO2019/PKUSC2019遊記

5.10

中鋪,火車好晃啊node

5.11

打了THUPC2019的練習賽,華容道好評(四個小兵,槓鴨!)ios

5.12

打了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。

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個小時就能夠寫完,因此要多想。
相關文章
相關標籤/搜索