QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#641815 | #8237. Sugar Sweet II | Violet_fans | RE | 0ms | 0kb | C++14 | 1.9kb | 2024-10-15 00:21:00 | 2024-10-15 00:21:00 |
Judging History
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