QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#593604#8237. Sugar Sweet IIDixiky_215WA 124ms36384kbC++175.0kb2024-09-27 14:56:252024-09-27 14:56:25

Judging History

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

  • [2024-11-04 16:59:03]
  • hack成功,自动添加数据
  • (/hack/1109)
  • [2024-09-27 14:56:25]
  • 评测
  • 测评结果:WA
  • 用时:124ms
  • 内存:36384kb
  • [2024-09-27 14:56:25]
  • 提交

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
*/

Details

Tip: Click on the bar to expand more detailed information

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'