石头剪刀布

哇自闭了,一开始用的 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\n",p2[tmp.c]*p3[n-tmp.w]%mod);
69         }
70     }
71 }
View Code

 

posted @ 2019-01-30 20:11  MXang  阅读(386)  评论(0编辑  收藏  举报