你相信缘分吗,反正我是很相信,前几天刚看了prufer序列这个东西今天就看到了洛谷上的模板题。
可是这个题O(n),还卡读入就很难受了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#define ll long long
#define llu unsigned ll
using namespace std;
char buffer[100001],*S,*T;
inline char Get_Char()
{
if (S==T)
{
T=(S=buffer)+fread(buffer,1,100001,stdin);
if (S==T) return EOF;
}
return *S++;
}
inline int read()
{
char c;int re=0;
for(c=Get_Char();c<'0'||c>'9';c=Get_Char());
while(c>='0'&&c<='9') re=re*10+(c-'0'),c=Get_Char();
return re;
}
const int maxn=5001000;
int p[maxn],f[maxn],d[maxn];
int n,m;
void do1(void)
{
for(int i=1;i<n;i++)
f[i]=read(),d[f[i]]++;
for(int cnt=1,now=1;cnt<=n-2;cnt++,now++)
{
while(d[now]) ++now;
p[cnt]=f[now];
while(cnt<n-2&&!--d[p[cnt]]&&p[cnt]<now) p[cnt+1]=f[p[cnt]],++cnt;
}
ll ans=0;
for(int i=1;i<=n-2;i++)
ans^=1ll*i*p[i];
printf("%lld\n",ans);
}
void do2(void)
{
for(int i=1;i<=n-2;i++)
p[i]=read(),d[p[i]]++;
p[n-1]=n;
for(int i=1,now=1;i<=n-1;i++,now++)
{
while(d[now]) ++now;
f[now]=p[i];
while(i<n-1&&!--d[p[i]]&&p[i]<now) f[p[i]]=p[i+1],++i;
}
ll ans=0;
for(int i=1;i<n;i++)
ans^=1ll*i*f[i];
printf("%lld\n",ans);
}
int main(void)
{
n=read(),m=read();
if(m==1) do1();
else do2();
return 0;
}