提交时间:2024-08-30 14:21:46
运行 ID: 32020
#include<bits/stdc++.h> using namespace std; #define int long long #define lson (pos<<1) #define rson (pos<<1|1) #define pii pair<int,int> #define fr first #define sc second #define inx int I=h[u],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=300010,N=2010,inf=1000000000; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;} int n,q,d[MAXN],p[MAXN]; set<int>a[MAXN],as; queue<int>Q; void bfs(){ for(int i=1;i<=n;i++){ if(!d[i]){ Q.push(i); a[i].clear(); a[i].insert(i); } } while(!Q.empty()){ int u=Q.front();Q.pop(); a[u].insert(u); for(inx){ // for(auto i:a[u])p[i]++; // for(auto i:a[v])p[i]++; // a[v].clear(); // for(int i=1;i<=n;i++){if(p[i]>=2)a[v].insert(i);p[i]=0;} d[v]--; if(!d[v])Q.push(v); } } } int dfn[MAXN],cnt,son[MAXN],siz[MAXN],top[MAXN],ty,fa[MAXN],dep[MAXN]; void dfs(int u,int lst){ int mx=0;siz[u]=1;fa[u]=lst; for(inx)if(v!=lst){ dep[v]=dep[u]+1; dfs(v,u); siz[u]+=siz[v]; if(siz[v]>mx){ mx=siz[v]; son[u]=v; } } } void dfs2(int u,int lst){ dfn[u]=++cnt;top[u]=ty; if(son[u])dfs2(son[u],u); for(inx)if(v!=lst&&v!=son[u]){ ty=v; dfs2(v,u); } } struct segtree{ int t[MAXN<<2],lz[MAXN<<2]; void init(){memset(lz,-1,sizeof(lz));} void pushup(int pos){ t[pos]=t[lson]+t[rson]; } void pushdown(int pos,int l,int r){ if(~lz[pos]){ int mid=(l+r)>>1; t[lson]=lz[pos]*(mid-l+1); t[rson]=lz[pos]*(r-mid); lz[lson]=lz[pos]; lz[rson]=lz[pos]; lz[pos]=-1; } } void update(int pos,int l,int r,int ql,int qr,int x){ if(ql<=l&&qr>=r){ t[pos]=x*(r-l+1); lz[pos]=x; return; } pushdown(pos,l,r); int mid=(l+r)>>1; if(ql<=mid)update(lson,l,mid,ql,qr,x); if(qr>mid)update(rson,mid+1,r,ql,qr,x); pushup(pos); } int query(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r){ return t[pos]; } pushdown(pos,l,r); int mid=(l+r)>>1,res=0; if(ql<=mid)res=query(lson,l,mid,ql,qr); if(qr>mid)res+=query(rson,mid+1,r,ql,qr); return res; } }T; void upd(int x,int y){ while(top[x]!=top[y]){ if(dep[top[x]]<dep[top[y]])swap(x,y); T.update(1,1,n,dfn[top[x]],dfn[x],1); x=fa[top[x]]; } if(dfn[x]>dfn[y])swap(x,y); T.update(1,1,n,dfn[x],dfn[y],1); } void slv(){ n=read(); for(int i=1;i<=n;i++){ int x=read();d[i]=x; while(x--){ int tmp=read(); add_side(tmp,i); } } q=read(); if(n<=1000&&q<=1000){ for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[i].insert(j); bfs(); while(q--){ int x=read();as.clear(); while(x--){ int tmp=read(); for(auto i:a[tmp])as.insert(i); } printf("%ld\n",as.size()); } } else{ for(int i=1;i<=n;i++)if(!d[i])add_side(0,i); n++; dfs(0,0);ty=0;dfs2(0,0); T.init(); while(q--){ int x=read(); if(!x){ printf("0\n"); continue; } while(x--){ int tmp=read(); upd(tmp,0); } printf("%lld\n",T.query(1,1,n,1,n)-1); T.update(1,1,n,1,n,0); } } } signed main(){ slv(); return 0; }