QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#593614#8237. Sugar Sweet IIDixiky_215RE 3ms42512kbC++174.8kb2024-09-27 15:01:502024-09-27 15:01:51

Judging History

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

  • [2024-11-04 16:59:03]
  • hack成功,自动添加数据
  • (/hack/1109)
  • [2024-09-27 15:01:51]
  • 评测
  • 测评结果:RE
  • 用时:3ms
  • 内存:42512kb
  • [2024-09-27 15:01:50]
  • 提交

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

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 42512kb

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...

output:


result: