QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#467478#1288. Tokens on the TreezhouhuanyiRE 0ms0kbC++142.7kb2024-07-08 16:23:302024-07-08 16:23:30

Judging History

This is the latest submission verdict.

  • [2024-07-08 16:23:30]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 0kb
  • [2024-07-08 16:23:30]
  • Submitted

answer

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 10000000
#define mod 1000000007
using namespace std;
const int inf=(int)(1e9);
#define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
template<typename T>
void read(T& r){
r=0;bool w=0;char ch=gc();
while(ch<'0'||ch>'9')w=ch=='-'?1:0,ch=gc();
while(ch>='0'&&ch<='9')r=r*10+(ch^48),ch=gc();
r=w?-r:r;
}
void Adder(int &x,int d)
{
	x=x+d>=mod?x+d-mod:x+d;
	return;
}
void Adder2(int &x,int d)
{
	x=x+d<0?x+d+mod:x+d;
	return;
}
int MD(int x)
{
	return x>=mod?x-mod:x;
}
int MD2(int x)
{
	return x<0?x+mod:x;
}
int T,n,ans,rt,S[N+1],r[N+1],fa[N+1],sfa[N+1],sz[N+1],szt[N+1],maxp[N+1],smaxn[N+1],smaxn2[N+1],smaxn3[N+1];
bool used[N+1];
int main()
{
	freopen("bear.in","r",stdin);
	freopen("bear.out","w",stdout);
	int x,maxn;
	read(T),maxp[0]=inf;
	for (int i=1;i<=N;++i) S[i]=MD(S[i-1]+i);
	while (T--)
	{
		read(n),rt=ans=maxn=0;
		for (int i=1;i<=n;++i) used[i]=fa[i]=sfa[i]=r[i]=maxp[i]=0,smaxn[i]=smaxn2[i]=smaxn3[i]=-inf,sz[i]=1;
		for (int i=2;i<=n;++i) read(x),fa[i]=x;
		for (int i=n;i>=1;--i)
		{
			if (fa[i]) sz[fa[i]]+=sz[i],maxp[fa[i]]=max(maxp[fa[i]],sz[i]);
			maxp[i]=max(maxp[i],n-sz[i]);
			if (maxp[i]<maxp[rt]) rt=i;
		}
		used[rt]=1;
		for (int i=n;i>=1;--i)
			if (fa[i])
			{
				if (used[i]) used[fa[i]]=1,sfa[fa[i]]=i;
				else sfa[i]=fa[i];
			}
		for (int i=1;i<=n;++i)
		{
			if (i==rt) szt[i]=n;
			else if (used[i]) szt[i]=n-sz[sfa[i]];
			else szt[i]=sz[i];
		}
		for (int i=1;i<=n;++i)
			if (i!=rt&&max((n>>1)+1,n-szt[sfa[i]]+1)<=n-szt[i])
				Adder(ans,2ll*S[szt[i]]*MD2(S[n-szt[i]]-S[max((n>>1)+1,n-szt[sfa[i]]+1)-1])%mod);
		maxn=maxp[rt];
		for (int i=1;i<=n;++i)
			if (sfa[i]==rt)
				Adder(ans,2ll*S[szt[i]]*MD2(S[n>>1]-S[maxn])%mod);
		for (int i=1;i<=n;++i)
			if (i!=rt)
			{
				if (szt[i]>smaxn[sfa[i]]) smaxn3[sfa[i]]=smaxn2[sfa[i]],smaxn2[sfa[i]]=smaxn[sfa[i]],smaxn[sfa[i]]=szt[i];
				else if (szt[i]>smaxn2[sfa[i]]) smaxn3[sfa[i]]=smaxn2[sfa[i]],smaxn2[sfa[i]]=szt[i];
				else smaxn3[sfa[i]]=max(smaxn3[sfa[i]],szt[i]);
			}
		for (int i=1;i<=n;++i)
		{
			if (i==rt)
			{
				if (smaxn3[i]!=-inf) r[smaxn3[i]]=max(r[smaxn3[i]],smaxn2[i]);
			}
			else if (smaxn2[i]!=-inf) r[smaxn2[i]]=max(r[smaxn2[i]],smaxn[i]);
		}
		for (int i=n-1;i>=1;--i) r[i]=max(r[i],r[i+1]);
		for (int i=1;i<=maxn;++i)
		{
			if (r[i]>=i) Adder(ans,1ll*i*i%mod);
			else Adder(ans,2ll*i*i%mod);
			r[i]=max(r[i],i),r[i]=min(r[i],maxn),Adder(ans,2ll*i*MD2(S[r[i]]-S[i])%mod),Adder(ans,4ll*i%mod*MD2(S[maxn]-S[r[i]])%mod);
		}
		printf("%d\n",ans);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Dangerous Syscalls

input:

2
5
1 2 3 3
10
1 2 3 4 3 6 3 8 2

output:


result: