yicongli

LG4606

Mar 4th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=2e5+7;
  17.  
  18. int n,m,tot;
  19.  
  20. namespace Imag{
  21.     int sum[N];
  22.     vector<int>G[N];
  23.     int ans;
  24.    
  25.     void dfs(int x,int pre){
  26.         ans+=sum[x]-pre;
  27.         for(int i=0;i<G[x].size();++i){
  28.             dfs(G[x][i],sum[x]);
  29.         }
  30.         G[x].clear();
  31.     }
  32.    
  33.     inline int query(int x,int pre){
  34.         ans=0;
  35.         dfs(x,pre);
  36.         return ans;
  37.     }
  38. }
  39.  
  40. namespace Tree{
  41.     vector<int>G[N];
  42.    
  43.     int fa[N];
  44.     int dep[N];
  45.     int son[N];
  46.     int siz[N];
  47.     using Imag::sum;
  48.    
  49.     void dfs1(int x,int f){
  50.         fa[x]=f;
  51.         siz[x]=1;
  52.         dep[x]=dep[f]+1;
  53.         sum[x]=sum[f]+(x<=n);
  54.         for(int i=0;i<G[x].size();++i){
  55.             int v=G[x][i];
  56.             dfs1(v,x);
  57.             siz[x]+=siz[v];
  58.             if(siz[son[x]]<siz[v])son[x]=v;
  59.         }
  60.     }
  61.    
  62.     int top[N];
  63.     int dfn[N];
  64.     int dfs_clock;
  65.    
  66.     void dfs2(int x,int t){
  67.         top[x]=t;
  68.         dfn[x]=++dfs_clock;
  69.         if(!son[x])return ;
  70.         dfs2(son[x],t);
  71.         for(int i=0;i<G[x].size();++i){
  72.             int v=G[x][i];
  73.             if(v==son[x])continue;
  74.             dfs2(v,v);
  75.         }
  76.     }
  77.    
  78.     inline int lca(int u,int v){
  79.         while(top[u]!=top[v]){
  80.             if(dep[top[u]]<dep[top[v]])swap(u,v);
  81.             u=fa[top[u]];
  82.         }
  83.         return dep[u]<dep[v]?u:v;
  84.     }
  85.    
  86.     inline bool cmp(const int &a,const int &b){
  87.         return dfn[a]<dfn[b];
  88.     }
  89.    
  90.     int Top;
  91.     int sta[N];
  92.    
  93.     inline void ins(int x){
  94.         if(Top==0){
  95.             sta[++Top]=x;
  96.             return ;
  97.         }
  98.         int t=lca(x,sta[Top]);
  99.         while(Top>1&&dep[sta[Top-1]]>=dep[t]){
  100.             Imag::G[sta[Top-1]].push_back(sta[Top]);
  101.             Top--;
  102.         }
  103.         if(sta[Top]!=t){
  104.             Imag::G[t].push_back(sta[Top]);
  105.             sta[Top]=t;
  106.         }
  107.         sta[++Top]=x;
  108.     }
  109.    
  110.     int a[N];
  111.    
  112.     inline void solve(){
  113.         dfs1(1,0);
  114.         dfs2(1,1);
  115.         int q;r(q);
  116.         while(q--){
  117.             int c;r(c);
  118.             for(int i=1;i<=c;++i)r(a[i]);
  119.             sort(a+1,a+c+1,cmp);
  120.             Top=0;
  121.             int LCA=a[1];
  122.             for(int i=1;i<=c;++i)ins(a[i]),LCA=lca(LCA,a[i]);
  123.             while(Top>1){
  124.                 Imag::G[sta[Top-1]].push_back(sta[Top]);
  125.                 Top--;
  126.             }
  127.             printf("%d\n",Imag::query(LCA,sum[fa[LCA]])-c);
  128.         }
  129.         for(int i=1;i<=tot;++i){
  130.             son[i]=0;
  131.             G[i].clear();
  132.         }
  133.         dfs_clock=0;
  134.     }
  135. }
  136.  
  137. namespace Graph{
  138.     vector<int>G[N];
  139.    
  140.     int dfn[N];
  141.     int low[N];
  142.     int dfs_clock;
  143.    
  144.     int top;
  145.     int sta[N];
  146.     bool in[N];
  147.    
  148.     void dfs(int x,int f){
  149.         dfn[x]=low[x]=++dfs_clock;
  150.         sta[++top]=x;
  151.         for(int i=0;i<G[x].size();++i){
  152.             int v=G[x][i];
  153.             if(v==f)continue;
  154.             if(!dfn[v]){
  155.                 dfs(v,x);
  156.                 low[x]=min(low[x],low[v]);
  157.                 if(low[v]>=dfn[x]){
  158.                     Tree::G[x].push_back(++tot);
  159.                     int t;
  160.                     do{
  161.                         t=sta[top--];
  162.                         Tree::G[tot].push_back(t);
  163.                     }while(t!=v);
  164.                 }
  165.             }
  166.             else {
  167.                 low[x]=min(low[x],dfn[v]);
  168.             }
  169.         }
  170.     }
  171.    
  172.     inline void work(){
  173.         r(n),r(m);tot=n;
  174.         for(int i=1;i<=m;++i){
  175.             int u,v;r(u),r(v);
  176.             G[u].push_back(v);
  177.             G[v].push_back(u);
  178.         }
  179.         dfs(1,0);
  180.         for(int i=1;i<=n;++i){
  181.             G[i].clear();
  182.             dfn[i]=0;
  183.         }
  184.         dfs_clock=0;
  185.     }
  186. }
  187.  
  188. int main(){
  189. //  freopen(".in","r",stdin);
  190. //  freopen(".out","w",stdout);
  191.     int T;r(T);
  192.     while(T--){
  193.         Graph::work();
  194.         Tree::solve();
  195.     }
  196.     return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment