QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#467478 | #1288. Tokens on the Tree | zhouhuanyi | RE | 0ms | 0kb | C++14 | 2.7kb | 2024-07-08 16:23:30 | 2024-07-08 16:23:30 |
Judging History
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