再次写挂。 考前两三天每天平均打两场酒馆战旗,均吃鸡,$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;
}
考场代码

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-17
  • 2021-12-22
  • 2021-12-28
  • 2022-12-23
相关资源
相似解决方案