哇自闭了,一开始用的 pair<int,pair<int,int>>疯狂tle,换成node还是T,发现自己傻逼,就预处理的一下阶乘,然后wa,然后发现手残写错了一个地
https://www.zhixincode.com/contest/15/problem/I?problem_id=221
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define mk(a,b) make_pair(a,b) 4 using namespace std; 5 typedef long long ll; 6 const int N = 2e5+5; 7 const ll mod = 998244353; 8 inline int read() { 9 int X=0,w=1; char c=getchar(); 10 while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); } 11 while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar(); 12 return X*w; 13 } 14 int n,m; 15 int fa[N],w[N],c[N],ran[N];//父亲,比赛,主场 16 ll p2[N],p3[N]; 17 void init(){ 18 p2[0]=1;p3[0]=1; 19 for(int i=1;i<=n;i++){ 20 fa[i]=i; 21 p2[i]=p2[i-1]*2%mod; 22 p3[i]=p3[i-1]*3%mod; 23 } 24 } 25 struct node{ 26 int fa,w,c; 27 }; 28 node find(int x){ 29 if(fa[x]==x) return {fa[x],w[x],c[x]}; 30 int tmp = fa[x]; 31 int rw=w[x],rc=c[x]; 32 while (tmp!=fa[tmp]){ 33 rw+=w[tmp],rc+=c[tmp]; 34 tmp=fa[tmp]; 35 } 36 rw+=w[tmp],rc+=c[tmp]; 37 return {tmp,rw,rc}; 38 } 39 void unite(int x,int y){//y挑战x 40 node xx=find(x),yy=find(y); 41 if(xx.fa==yy.fa) return; 42 w[xx.fa]++;w[yy.fa]++; 43 c[xx.fa]++; 44 if(ran[xx.fa]<ran[yy.fa]){ 45 fa[xx.fa]=yy.fa; 46 w[xx.fa]-=w[yy.fa]; 47 c[xx.fa]-=c[yy.fa]; 48 } else{ 49 fa[yy.fa]=xx.fa; 50 w[yy.fa]-=w[xx.fa]; 51 c[yy.fa]-=c[xx.fa]; 52 if(ran[x]==ran[y]) 53 ran[x]++; 54 } 55 } 56 int main(){ 57 n=read();m=read(); 58 init(); 59 int op,x,y; 60 while (m--){ 61 op=read(); 62 if(op==1){ 63 x=read();y=read(); 64 unite(x,y); 65 } else{ 66 x=read(); 67 node tmp = find(x); 68 printf("%d ",p2[tmp.c]*p3[n-tmp.w]%mod); 69 } 70 } 71 }