QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#593604 | #8237. Sugar Sweet II | Dixiky_215 | WA | 124ms | 36384kb | C++17 | 5.0kb | 2024-09-27 14:56:25 | 2024-09-27 14:56:25 |
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],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;instk[x]=1;
}
bool kkk=0;
int aim;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(belong[y]) continue;
if(vis[y])
{
kkk=1;aim=y;
continue;
}
dfs(y);
}
if(kkk)
{
// flag=1;
// while(stk[top]!=aim)
// {
// instk[stk[top]]=0;
// id[++num]=stk[top];
// top--;
// }
// instk[stk[top]]=0;
// id[++num]=stk[top];
// top--;
// for(int j=1;j<=top;j++) instk[stk[j]]=0;
// top=0;
}
if(!flag)
{
if(top>0) instk[stk[top]]=0,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
*/
详细
Test #1:
score: 100
Accepted
time: 6ms
memory: 11804kb
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
Wrong Answer
time: 124ms
memory: 36384kb
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:
508432375 168140163 892620793 578579275 251380640 863886789 864679185 463975750 558804051 604216585 694033700 499417132 375390750 337590759 467353355 111206671 983760005 984444619 322277587 138763925 205122047 977360756 512133948 665454200 902284038 240323331 168068923 421298438 601054667 1100469...
result:
wrong answer 1st numbers differ - expected: '854665334', found: '508432375'