<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【CF613D】Kingdom and its Cities 虛樹+樹形DP

      【CF613D】Kingdom and its Cities

      題意:給你一棵樹,每次詢問給出k個關鍵點,問做多干掉多少個非關鍵點才能使得所有關鍵點兩兩不連通。

      $n,\sum k\le 10^5$

      題解:刷虛樹板子啦!

      首先如果兩個關鍵點相鄰則無解。然后建出虛樹,進行樹形DP。設f[i]表示i子樹中的關鍵點都不連通,且i子樹中的點與外面的點也不連通的最小花費,g[i]表示i子樹重的關鍵點都不連通,且子樹中只有一個點與外面的點連通的最小花費。轉移時討論一波即可。

      #include <cstdio>
      #include <cstring>
      #include <iostream>
      #include <algorithm>
      #include <vector>
      using namespace std;
      const int maxn=100010;
      int n,m,now,cnt,top;
      int to[maxn<<1],nxt[maxn<<1],head[maxn],fa[19][maxn],Log[maxn],dep[maxn],A[maxn],vis[maxn],st[maxn],f[maxn],g[maxn],p[maxn],q[maxn];
      vector<int> ch[maxn];
      void dfs(int x)
      {
      	p[x]=++q[0],q[q[0]]=x;
      	for(int i=head[x];i!=-1;i=nxt[i])	if(to[i]!=fa[0][x])	fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]);
      }
      inline void add(int a,int b)
      {
      	to[cnt]=b,nxt[cnt]=head[a],head[a]=cnt++;
      }
      bool cmp(const int &a,const int &b)
      {
      	return p[a]<p[b];
      }
      inline int lca(int a,int b)
      {
      	if(dep[a]<dep[b])	swap(a,b);
      	for(int i=Log[dep[a]-dep[b]];i>=0;i--)	if(dep[fa[i][a]]>=dep[b])	a=fa[i][a];
      	if(a==b)	return a;
      	for(int i=Log[dep[a]];i>=0;i--)	if(fa[i][a]!=fa[i][b])	a=fa[i][a],b=fa[i][b];
      	return fa[0][a];
      }
      void DP(int x)
      {
      	int y,t0=0,t1=0,t2=0;
      	vector<int>::iterator it;
      	for(it=ch[x].begin();it!=ch[x].end();it++)
      	{
      		y=*it,DP(y);
      		t2=min(t2+f[y],t0+min(f[y],g[y])),t0+=f[y],t1+=min(f[y],g[y]);
      	}
      	ch[x].clear();
      	if(vis[x]==now)
      	{
      		g[x]=t0,f[x]=t0+1;
      	}
      	else
      	{
      		g[x]=t2,f[x]=min(t1+1,t0);
      	}
      }
      inline int rd()
      {
      	int ret=0,f=1;	char gc=getchar();
      	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
      	while(gc>='0'&&gc<='9')	ret=ret*10+(gc^'0'),gc=getchar();
      	return ret*f;
      }
      int main()
      {
      	//freopen("a.in","r",stdin);
      	n=rd();
      	int i,j,a,b,c;
      	memset(head,-1,sizeof(head));
      	for(i=2;i<=n;i++)	a=rd(),b=rd(),add(a,b),add(b,a),Log[i]=Log[i>>1]+1;
      	dep[1]=1,dfs(1);
      	for(j=1;(1<<j)<=n;j++)	for(i=1;i<=n;i++)	fa[j][i]=fa[j-1][fa[j-1][i]];
      	m=rd();
      	for(now=1;now<=m;now++)
      	{
      		a=rd();
      		for(i=1;i<=a;i++)	A[i]=rd(),vis[A[i]]=now;
      		for(i=1;i<=a;i++)	if(vis[fa[0][A[i]]]==now)
      		{
      			puts("-1");
      			break;
      		}
      		if(i<=a)	continue;
      		sort(A+1,A+a+1,cmp);
      		st[top=1]=A[1];
      		for(i=2;i<=a;i++)
      		{
      			c=lca(A[i-1],A[i]);
      			while(top&&dep[st[top]]>dep[c])
      			{
      				b=st[top--];
      				if(top&&dep[st[top]]>dep[c])	ch[st[top]].push_back(b);
      				else	ch[c].push_back(b);
      			}
      			if(!top||st[top]!=c)	st[++top]=c;
      			st[++top]=A[i];
      		}
      		while(top>1)	ch[st[top-1]].push_back(st[top]),top--;
      		DP(st[top]);
      		a=min(g[st[top]],f[st[top]]);
      		printf("%d\n",a);
      	}
      	return 0;
      }
      posted @ 2018-04-05 19:12  CQzhangyu  閱讀(745)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 石河子市| 老太脱裤子让老头玩xxxxx| 欧美成人黄在线观看| 网友偷拍视频一区二区三区| 国产系列高清精品第一页| 337p日本欧洲亚洲大胆色噜噜| 国产二区三区不卡免费| 在线看av一区二区三区| 日韩精品国产二区三区| 婷婷五月综合激情| 少妇人妻av毛片在线看| 亚欧洲乱码视频一二三区| 中文字幕av一区二区三区人妻少妇| 久久一日本道色综合久久| 国产高清不卡视频| 性色av无码不卡中文字幕| 亚洲国产综合自在线另类| 国产精品视频午夜福利| 无码成人午夜在线观看| 囊谦县| 亚洲人午夜精品射精日韩| 国产高清在线男人的天堂| 法库县| 国产精品一区二区三区日韩| 成人国产精品中文字幕| 国产亚洲一区二区三区av| 亚洲 一区二区 在线| 日本一区二区三区专线| 亚洲国产精品久久无人区| 在线看国产精品自拍内射| 亚洲日本va午夜中文字幕久久| 方城县| 好男人官网资源在线观看| 中文字幕精品无码一区二区| 久久青青草原亚洲AV无码麻豆| 国产360激情盗摄全集| 久久av无码精品人妻系列试探| 亚洲精品中文av在线| 国产一区二区三区黄色片| 午夜激情福利一区二区| 中文字幕日韩一区二区不卡|