CSP-S 2019 游记
CSP-S 2019 游记
Day1
t3调不完导致心态爆炸,所以咕咕咕
就贴一个赛后重写的能过luogu自测的代码吧...
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define debug(x) cerr<<#x<<" = "<<x
#define sp <<" "
#define el <<endl
#define fgx cerr<<" ---------------------------------------------- "<<endl
#define uint unsigned int
#define ULL unsigned long long
#define DB double
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
inline LL read(){
LL nm=0; bool fh=true; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) fh^=(cw=='-');
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return fh?nm:-nm;
}
#define M 2020
int n,c[M][M],sz[M],pre[M][M],nxt[M][M],fs[M],las[M],f[M][M],hv[M][M],id[M][M];
inline int fd(int x,int w){return f[x][w]==w?w:f[x][w]=fd(x,f[x][w]);}
int Pos[M],p[M],pos,q[M],hd,tl,from[M],fa[M];
int perm[M];
inline void deliver(int x){
hd=tl=1,pos=n+1;
if(fs[x]) q[tl]=c[x][fs[x]],from[tl++]=x;
else{
for(int i=1;i<=sz[x];i++) if(pre[x][i]==0&&(fd(x,i)!=fd(x,las[x])||hv[x][fd(x,las[x])]==sz[x]))
q[tl]=c[x][i],from[tl++]=x;
}
while(hd<tl){
int y=q[hd]; fa[y]=from[hd],++hd;
int k=id[y][fa[y]];
if((las[y]==0||las[y]==k)&&nxt[y][k]==0&&(fd(y,k)!=fd(y,fs[y])||hv[y][fd(y,fs[y])]==sz[y])) pos=min(pos,y);
if(nxt[y][k]>0){q[tl]=c[y][nxt[y][k]],from[tl++]=y;continue;} if(las[y]==k) continue;
for(int i=1;i<=sz[y];i++) if(fd(y,i)!=fd(y,k)&&pre[y][i]==0&&i!=fs[y]){
if(fd(y,k)==fd(y,las[y])) continue; if(fd(y,i)==fd(y,fs[y])) continue;
if(fd(y,k)==fd(y,fs[y])&&fd(y,i)==fd(y,las[y])&&hv[y][fd(y,k)]+hv[y][fd(y,i)]<sz[y]) continue;
q[tl]=c[y][i],from[tl++]=y;
}
}
printf("%d ",pos);
assert(pos<=n);
las[pos]=id[pos][fa[pos]]; int y=fa[pos];
for(;y!=x;y=fa[y],pos=fa[pos]){
int come=id[y][fa[y]];
int leave=id[y][pos];
nxt[y][come]=leave;
pre[y][leave]=come;
int a=fd(y,come);
int b=fd(y,leave);
if(a==b) continue;
hv[y][b]+=hv[y][a];
f[y][a]=b;
} fs[x]=id[x][pos];
}
inline void solve(){
n=read();
for(int i=1;i<=n;i++) perm[i]=i,swap(perm[i],perm[rand()%i+1]);
for(int x=1;x<=n;fs[x]=las[x]=sz[x]=0,x++) while(sz[x])
pre[x][sz[x]]=nxt[x][sz[x]]=c[x][sz[x]]=f[x][sz[x]]=hv[x][sz[x]]=0,--sz[x];
for(int i=1;i<=n;i++) Pos[i]=read();
for(int i=1,x,y;i<n;++i){
x=read(),y=read();
id[x][y]=++sz[x],id[y][x]=++sz[y];
c[x][sz[x]]=y,c[y][sz[y]]=x;
hv[x][sz[x]]=hv[y][sz[y]]=1;
f[x][sz[x]]=sz[x];
f[y][sz[y]]=sz[y];
}
for(int x=1;x<=n;x++) if(sz[x]==1) las[x]=fs[x]=1;
if(n==1){puts("1");return;}
for(int x=1;x<=n;x++) deliver(Pos[x]); puts("");//puts("good");
}
int main(){
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
for(int Cas=read();Cas;--Cas) solve();
return 0;
}
Day2
t1想了一会发现随便搞一下DP
DP是个生成函数卷积形式,有没有人分治NTT的啊
t2大概猜了个结论,发现他过了所有的样例
t3觉得随便DP一下,后来越想与不对劲,画了画图,大概对于每个点统计一下删除能使得他能变成重心的边的数量即可,分三类分别求,疯狂码码码结束之后还有半小时
人生中第一次也是最后一次正式的CSP就这样结束了
upd:代码发下来,自测并没有挂太多分,总算是有惊无险。。。。