QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#665232#8237. Sugar Sweet IIOIer_kzc#TL 87ms26328kbC++172.4kb2024-10-22 10:12:502024-10-22 10:12:51

Judging History

你现在查看的是最新测评结果

  • [2024-11-04 16:59:03]
  • hack成功,自动添加数据
  • (/hack/1109)
  • [2024-10-22 10:12:51]
  • 评测
  • 测评结果:TL
  • 用时:87ms
  • 内存:26328kb
  • [2024-10-22 10:12:50]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define p 1000000007
#define ll long long
int read(){
    int u=0;
    char c=getchar();
    while(c>'9'||c<'0')c=getchar();
    while(c>='0'&&c<='9'){
        u=u*10+c-48;
        c=getchar();
    }
    return u;
}
int ksm(int x,int y){
    if(!x)return 1;
    ll u=ksm(x/2,y);
    u=u*u%p;
    if(x&1)u=u*y%p;
    return u;
}
int n;
int a[500011],b[500011],w[500011],cb[500011];
int jc[500011],ny[500011],bz[500011],dis[500011];
vector<int>R[500011];
int ls[500011];
int d[500011];
void solve(){
    n=read();
    fo(i,1,n)bz[i]=dis[i]=cb[i]=0,R[i].clear();
    fo(i,1,n)a[i]=read();
    fo(i,1,n)b[i]=read(),R[b[i]].push_back(i);
    fo(i,1,n)w[i]=read();
    fo(i,1,n){
        if(R[i].size()&&!bz[i]){
            if(b[i]==i){
                bz[i]=1;
                continue;
            }
            int t=b[i],u=0;
            if(a[b[i]]>a[i])u=i;
            bz[i]=1;
            ls[t]=i;
            while(t!=i){
                if(a[b[t]]>a[t])u=t;
                bz[t]=1;
                ls[b[t]]=t;
                t=b[t];
            }
            if(!u)continue;
            dis[u]=1;
            t=ls[u];
            while(t!=u){
                if(a[b[t]]>a[t])dis[t]=1;
                else if(a[b[t]]+w[b[t]]>a[t]&&dis[b[t]])dis[t]=dis[b[t]]+1;
                t=ls[t];
            }
        }
    }
    fo(i,1,n)ls[i]=0;
    fo(i,1,n){
        fo(j,0,(int)R[i].size()-1){
            if(!bz[R[i][j]]){
                ls[i]=R[i][j];
                cb[R[i][j]]++;
            }
        }
    }
    int h=0;
    fo(i,1,n){
        if(!cb[i])d[++d[0]]=i;
    }
    while(h<d[0]){
        int t=d[++h];
        if(!dis[t]){
            if(a[b[t]]>a[t])dis[t]=1;
            else if(a[b[t]]+w[b[t]]>a[t]&&dis[b[t]])dis[t]=dis[b[t]]+1;
        }
        if(ls[t]){
            cb[ls[t]]--;
            if(!cb[ls[t]]){
                d[++d[0]]=ls[t];
            }
        }
    }
    ny[0]=0;
    fo(i,1,n){
        ll ans=a[i]+(ll)w[i]*ny[dis[i]]%p;
        ans%=p;
        printf("%lld ",ans);
    }
    puts("");
}
int main(){
    jc[0]=ny[0]=1;
    fo(i,1,5e5){
        jc[i]=(ll)jc[i-1]*i%p;
        ny[i]=ksm(p-2,jc[i]);
    }
    int T=read();
    while(T){
        --T;
        solve();
    }
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 87ms
memory: 26328kb

input:

4
4
2 5 5 2
4 2 1 3
3 2 1 4
3
5 4 3
1 1 1
6 6 6
3
5 4 3
2 3 1
1 2 3
5
2 1 3 2 1
5 1 1 3 4
1 3 4 2 4

output:

500000007 5 5 6 
5 10 9 
166666673 5 6 
500000006 4 3 4 5 

result:

ok 15 numbers

Test #2:

score: -100
Time Limit Exceeded

input:

50000
5
508432375 168140163 892620793 578579275 251380640
3 4 4 1 3
346232959 736203130 186940774 655629320 607743104
1
863886789
1
364158084
18
864679185 463975750 558804051 604216585 694033700 499417132 375390750 337590759 467353355 111206671 983760005 984444619 322277587 138763925 205122047 97736...

output:


result: