#include <bits/stdc++.h>
int K,su[500009],num[500009],pa[500009],vq[500009],dep[500009],rt[500009];
inline int id(int x,int y) {
return su[x-1]+y;
}
int sg[2000009];
#define ls (n<<1)
#define rs ((n<<1)|1)
#define md ((l+r)>>1)
int fd(int n,int l,int r,int L,int R) {
if(sg[n]==0||r<L||R<l) return 0;
if(l==r) {
sg[n]--;
return 1;
}
int a=fd(rs,md+1,r,L,R);
if(a==0) a=fd(ls,l,md,L,R);
sg[n]=sg[ls]+sg[rs];
return a;
}
void up(int n,int l,int r,int p) {
while(l<r) {
sg[n]++;
if(p<=md) n=ls,r=md;
else n=rs,l=md+1;
}
sg[n]++;
}
signed main(void) {
scanf("%d %d",&K,&num[1]);
su[1]=num[1];
for(int i=2;i<=K;i++) {
scanf("%d",&num[i]);
su[i]=su[i-1]+num[i];
for(int j=1;j<=num[i];j++) {
int x;scanf("%d",&x);
dep[id(i,j)]=i-1;
if(x) pa[id(i,j)]=id(i-1,x);
// printf("")
}
}
for(int i=1;i<=su[K];i++) {
if(pa[i]==0) {
rt[i]=i;
} else {
rt[i]=rt[pa[i]];
vq[pa[i]]=1;
}
}
int as=0;
for(int i=1;i<=su[K];i++) {
if(vq[i]) continue;
as++;
int l=dep[rt[i]],r=dep[i];
l++;r++;
//printf("%d %d\n",l,r);
if(l>1) as-=fd(1,1,K,1,l-1);
up(1,1,K,r);
}
printf("%d",as);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <bits/stdc++.h> int K,su[500009],num[500009],pa[500009],vq[500009],dep[500009],rt[500009]; inline int id(int x,int y) { return su[x-1]+y; } int sg[2000009]; #define ls (n<<1) #define rs ((n<<1)|1) #define md ((l+r)>>1) int fd(int n,int l,int r,int L,int R) { if(sg[n]==0||r<L||R<l) return 0; if(l==r) { sg[n]--; return 1; } int a=fd(rs,md+1,r,L,R); if(a==0) a=fd(ls,l,md,L,R); sg[n]=sg[ls]+sg[rs]; return a; } void up(int n,int l,int r,int p) { while(l<r) { sg[n]++; if(p<=md) n=ls,r=md; else n=rs,l=md+1; } sg[n]++; } signed main(void) { scanf("%d %d",&K,&num[1]); su[1]=num[1]; for(int i=2;i<=K;i++) { scanf("%d",&num[i]); su[i]=su[i-1]+num[i]; for(int j=1;j<=num[i];j++) { int x;scanf("%d",&x); dep[id(i,j)]=i-1; if(x) pa[id(i,j)]=id(i-1,x); // printf("") } } for(int i=1;i<=su[K];i++) { if(pa[i]==0) { rt[i]=i; } else { rt[i]=rt[pa[i]]; vq[pa[i]]=1; } } int as=0; for(int i=1;i<=su[K];i++) { if(vq[i]) continue; as++; int l=dep[rt[i]],r=dep[i]; l++;r++; //printf("%d %d\n",l,r); if(l>1) as-=fd(1,1,K,1,l-1); up(1,1,K,r); } printf("%d",as); } |
English