再次写挂。 考前两三天每天平均打两场酒馆战旗,均吃鸡,$rp--$ ,$XJ$ 信心赛被反向打击,$rp--$。
期望得分 $100+100+40+60=300$ 。 实际得分 $60+92+40+35=227$ 。
A
没写高精度,还写了个先乘后除,不卡我卡谁?
拓扑,高精度。 由于过懒写了个 $int128$ 。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<vector> #include<queue> #define pb push_back #define mp make_pair #define fi first #define se second #define int long long using namespace std; inline int read(){ int f=1,ans=0; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } const int MAXN=1e5+11; int gcd(int a,int b){return !b?a:gcd(b,a%b);} int N,M,Ansx[MAXN],Ansy[MAXN],d[MAXN]; vector<int> vec[MAXN]; queue<int> que; signed main(){ N=read(),M=read(); for(int i=1;i<=N;i++){ int len=read(); for(int j=1;j<=len;j++){int x=read();d[x]++;vec[i].pb(x);} } for(int i=1;i<=N;i++) if(!d[i]){Ansx[i]=Ansy[i]=1;que.push(i);} while(!que.empty()){ int xx=que.front(); que.pop(); int siz=vec[xx].size(); int rx=Ansx[xx],ry=Ansy[xx]*siz,t=gcd(rx,ry); rx/=t,ry/=t; for(int i=0;i<siz;i++){ int v=vec[xx][i]; if(!Ansx[v]&&!Ansy[v]){Ansx[v]=rx,Ansy[v]=ry;} else{ int X=Ansx[v]*ry+Ansy[v]*rx,Y=Ansy[v]*ry,T=gcd(X,Y); X/=T,Y/=T; Ansx[v]=X,Ansy[v]=Y; }d[v]--; if(!d[v]) que.push(v); } } for(int i=1;i<=N;i++) if(!vec[i].size()) printf("%lld %lld\n",Ansx[i],Ansy[i]); return 0; }