QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#641815#8237. Sugar Sweet IIViolet_fansRE 0ms0kbC++141.9kb2024-10-15 00:21:002024-10-15 00:21:00

Judging History

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

  • [2024-11-04 16:59:03]
  • hack成功,自动添加数据
  • (/hack/1109)
  • [2024-10-15 00:21:00]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-10-15 00:21:00]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define vi vector<int>
#define vvi vector<vector<int>> 
#define pii pair<int, int>
using namespace std;
using i64 = long long; 
const int N=5e5+10,mod=1e9+7;
int n;
int a[N];
int qmi(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b%2==1) res=res*a%mod;
        a=a*a%mod;
        b/=2;
    }
    return res%mod;
}
int inv(int a)
{
    return qmi(a,mod-2);
}
int ans[N];
int b[N];
int w[N];
int dist[N];
vector<int> e[N];
int fac[N];
int ifac[N];
void init(int s)
{
    fac[0]=1;
    for(int i=1;i<=s+10;i++)
        fac[i]=fac[i-1]*i%mod;
    for(int i=0;i<=s+10;i++)
        ifac[i]=inv(fac[i])%mod;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],dist[i]=0;
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++) cin>>w[i],e[i].clear();
    for(int i=1;i<=n;i++)
    {
        ans[i]=a[i];
        if(i==b[i])
        {
            ans[i]=a[i]%mod;
            continue;
        }
        if(a[i]<a[b[i]]) ans[i]=(a[i]+w[i])%mod,dist[i]=1;
        else if(a[i]>=a[b[i]]+w[b[i]]) ans[i]=a[i]%mod,dist[i]=0;
        else 
        {
            e[b[i]].push_back(i);
        }
    }
    auto dfs = [&](auto dfs,int u,int f) ->void{
        for(auto v : e[u])
        {
            if(v==f) continue;
            dist[v]=dist[u]+1;
            dfs(dfs,v,u);
        }
    };
    for(int i=1;i<=n;i++)
    {
        if(dist[i]==1)  dfs(dfs,i,0);
    }
    for(int i=1;i<=n;i++)
    {
        if(dist[i]>1)
        {
            ans[i]=((a[i]+w[i])%mod*ifac[dist[i]]%mod+a[i]*(1+mod-ifac[dist[i]])%mod)%mod;
        }
    }
    for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[i==n];
    
    return ;
}
signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t = 1;
    init(500010);
    std::cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;

}

詳細信息

Test #1:

score: 0
Runtime Error

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:


result: