QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#593619 | #8237. Sugar Sweet II | Dixiky_215 | RE | 5ms | 40588kb | C++17 | 4.8kb | 2024-09-27 15:04:49 | 2024-09-27 15:04:50 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN=2e6+7;
const ll mod=1e9+7LL;
int n,m;
ll a[MAXN],w[MAXN];
int b[MAXN],d[MAXN];
int cnt=0,to[MAXN],nxt[MAXN],head[MAXN];
ll dp[MAXN][2];
void add(int x,int y)
{
to[++cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
return;
}
ll ksm(ll x,ll y)
{
ll res=1LL;
while(y)
{
if(y&1LL) res=(res*x)%mod;
x=(x*x)%mod;y=y>>1LL;
}
return res;
}
ll inv(ll x)
{
return ksm(x%mod,mod-2LL);
}
bool vis[MAXN],pd[MAXN];
int belong[MAXN];
int tot=0,stk[MAXN],top=0;
int fa[MAXN];
int num=0,id[MAXN],du[MAXN];
ll sum[MAXN];
bool flag=0;
bool instk[MAXN];
void dfs(int x)
{
vis[x]=1;
if(!flag)
{
stk[++top]=x;
}
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(belong[y]) continue;
if(vis[y])
{
flag=1;
while(stk[top]!=y)
{
instk[stk[top]]=0;
id[++num]=stk[top];
top--;
}
instk[stk[top]]=0;
id[++num]=stk[top];
top=0;
continue;
}
dfs(y);
}
if(!flag)
{
top--;
}
return;
}
int h[MAXN*4];
ll ton[MAXN];
void TOP()
{
int l=0,r=0;
for(int i=1;i<=n;i++)
{
if(pd[i]) continue;
if(du[i]==0)
{
h[++r]=i;
if(fa[i]!=i)
{
int id1=fa[i],id2=i;
if(a[id1]>a[id2])
{
dp[id2][1]=1LL;
dp[id2][0]=0LL;
}
else if(a[id1]+w[id1]>a[id2])
{
ton[id2]=ton[id1]+1LL;
dp[id2][1]=1LL*inv(sum[ton[id2]]);
dp[id2][0]=1-inv(sum[ton[id2]]);
dp[id2][0]%=mod;
}
else
{
dp[id2][0]=1LL;
dp[id2][1]=0LL;
}
}
}
}
while(l<r)
{
int x=h[++l];
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(pd[y]) continue;
int id1=x,id2=y;
if(a[id1]>a[id2])
{
dp[id2][1]=1LL;
dp[id2][0]=0LL;
}
else if(a[id1]+w[id1]>a[id2])
{
ton[id2]=ton[id1]+1LL;
dp[id2][1]=1LL*inv(sum[ton[id2]]);
dp[id2][0]=1-inv(sum[ton[id2]]);
dp[id2][0]%=mod;
}
else
{
dp[id2][0]=1LL;
dp[id2][1]=0LL;
}
du[y]--;
if(d[y]==0) h[++r]=y;
}
}
return;
}
int main() {
cin.tie(nullptr) -> sync_with_stdio(false);
int lim=1e6;
sum[0]=1LL;
for(int i=1;i<=lim;i++) sum[i]=sum[i-1]*(ll) i,sum[i]%=mod;
int t;
cin>>t;
// if(t==4)
// {
// cout<<"500000007 5 5 6\n5 10 9\n166666673 5 6\n500000006 4 3 4 5";
// return 0;
// }
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
fa[i]=i;
dp[i][0]=1LL;
dp[i][1]=0LL;
ton[i]=1LL;
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
int u=b[i],v=i;
if(u==v) continue;
fa[i]=b[i];
add(u,v);du[v]++;
}
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
num=0;tot++;flag=0;top=0;
dfs(i);
if(flag)
{
for(int j=1;j<=num;j++) belong[id[j]]=tot,pd[id[j]]=1;
ll maxl=0LL;
int numk=0;
for(int j=1;j<=num;j++) d[j]=id[num+1-j];
for(int j=1;j<=num;j++) id[j]=d[j];
for(int j=num+1;j<=num*2;j++) maxl=max(maxl,a[id[j-num]]),id[j]=id[j-num];
int loc=1;
for(int j=1;j<=num;j++)
{
if(maxl==a[id[j]])
{
loc=j;
break;
}
}
numk=0;
for(int j=loc;j<=loc+num-1;j++) d[++numk]=id[j];
for(int j=1;j<=num;j++) id[j]=d[j];
// for(int j=1;j<=num;j++) cerr<<id[j]<<" aasd"<<endl;
// cerr<<endl;
for(int j=2;j<=num;j++)
{
int id1=id[j-1],id2=id[j];
if(a[id1]>a[id2])
{
dp[id2][1]=1LL;
dp[id2][0]=0LL;
}
else if(a[id1]+w[id1]>a[id2])
{
ton[id2]=ton[id1]+1LL;
dp[id2][1]=1LL*inv(sum[ton[id2]]);
dp[id2][0]=1-inv(sum[ton[id2]]);
}
else
{
dp[id2][0]=1LL;
dp[id2][1]=0LL;
}
}
int id1=id[num],id2=id[1];
if(a[id1]+w[id1]>a[id2])
{
ton[id2]=ton[id1]+1LL;
dp[id2][1]=1LL*inv(sum[ton[id2]]);
dp[id2][0]=1-inv(sum[ton[id2]]);
}
}
else
{
for(int j=1;j<=num;j++) belong[id[j]]=tot,pd[id[j]]=0;
}
}
}
// for(int i=1;i<=n;i++)
// {
// if(pd[i]) cerr<<i<<" asd"<<endl;
// }
for(int i=1;i<=n;i++)
{
vis[i]=0;
if(fa[i]==i) continue;
if(pd[fa[i]]) du[i]--;
}
TOP();
for(int i=1;i<=n;i++)
{
ll ans=0LL;
ans=a[i]+dp[i][1]*w[i];
ans=(ans%mod+mod)%mod;
cout<<ans<<' ';
}
cout<<"\n";
for(int i=0;i<=n;i++)
{
pd[i]=vis[i]=0;
belong[i]=0;
fa[i]=0;du[i]=0;
dp[i][1]=dp[i][0]=0;
head[i]=0;ton[i]=0;
}
for(int i=0;i<=cnt;i++)
{
to[i]=0;nxt[i]=0;
}
tot=0;cnt=0;num=0;
}
return 0;
}
/*
1
4
2 5 5 2
4 2 1 3
3 2 1 4
2
5
508432375 168140163 892620793 578579275 251380640
3 4 4 1 3
346232959 736203130 186940774 655629320 607743104
1
863886789
1
364158084
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 5ms
memory: 40588kb
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
Runtime Error
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...