RT,在本地Dev可以跑,样例也过了,但是交上去都是RE,特来求助谷内大佬!(悬一关)
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int N=5e5+10;
int n,m,rt,root[N];
int he[N],ne[N<<1],to[N<<1],tot=1;
void addedge(int x,int y){
to[++tot]=y;
ne[tot]=he[x];
he[x]=tot;
}
int fat[N],dep[N],siz[N],son[N],top[N],dfo[N],seq[N],cnt;
void dfs1(int x,int f){
fat[x]=f,dep[x]=dep[f]+1,siz[x]=1;
for(int i=he[x];i;i=ne[i]){
int v=to[i];
if(v==fat[x]){
continue;
}
dfs1(v,x);
siz[x]+=siz[v];
if(siz[v]>siz[son[x]]){
son[x]=v;
}
}
}
void dfs2(int x,int t){
dfo[x]=++cnt,top[x]=t,seq[cnt]=x;
if(son[x]){
dfs2(son[x],t);
}
for(int i=he[x];i;i=ne[i]){
int v=to[i];
if(v==fat[x]||v==son[x]){
continue;
}
dfs2(v,v);
}
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
x=fat[top[x]];
}
else{
y=fat[top[y]];
}
}
if(dep[x]>dep[y]){
swap(x,y);
}
return x;
}
struct node{
int l,r,sum;
}tr[N<<5];
void pushup(int x){
tr[x].sum=tr[tr[x].l].sum+tr[tr[x].r].sum;
}
int build(int l,int r){
int p=++tot;
if(l==r){
return p;
}
int mid=(l+r)>>1;
tr[p].l=build(l,mid);
tr[p].r=build(mid+1,r);
}
int insert(int p,int l,int r,int x){
int q=++tot;
tr[q]=tr[p];
if(l==r){
++tr[q].sum;
return q;
}
int mid=(l+r)>>1;
if(x<=mid){
tr[q].l=insert(tr[p].l,l,mid,x);
}
else{
tr[q].r=insert(tr[p].r,mid+1,r,x);
}
pushup(q);
return q;
}
int query(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
return tr[x].sum;
}
int mid=(l+r)>>1;
int res=0;
if(ql<=mid){
res+=query(tr[x].l,l,mid,ql,qr);
}
if(qr>mid){
res+=query(tr[x].r,mid+1,r,ql,qr);
}
return res;
}
int ask(int i,int x,int y){
int res=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
res+=query(root[i],1,n,dfo[top[x]],dfo[x]);
x=fat[top[x]];
}
else{
res+=query(root[i],1,n,dfo[top[y]],dfo[y]);
y=fat[top[y]];
}
}
if(dep[x]>dep[y]){
swap(x,y);
}
res+=query(root[i],1,n,dfo[x],dfo[y]);
return res;
}
int main(){
scanf("%d",&n);
int op,x,y,k;
for(int i=1;i<=n;i++){
scanf("%d",&x);
addedge(x,i);
addedge(i,x);
if(x==0){
rt=i;
}
}
dfs1(rt,0);
dfs2(rt,rt);
tot=0;
root[0]=build(1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&x,&y,&k);
int lca=LCA(x,y);
printf("%d %d\n",dep[x]+dep[y]-dep[lca]*2+1,ask(i-k>=0?i-k:0,x,y));
root[i]=root[i-1];
}
else{
scanf("%d",&x);
root[i]=insert(root[i-1],1,n,x);
// cout<<tr[root[i]].sum<<endl;
}
}
}