HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
来源:互联网 发布:淘宝卡片祝福语范文 编辑:程序博客网 时间:2024/05/10 09:57
Auxiliary Set
Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 873 Accepted Submission(s): 271
Problem Description
Given a rooted tree with n vertices, some of the vertices are important.
An auxiliary set is a set containing vertices satisfying at least one of the two conditions:
∙ It is an important vertex
∙ It is the least common ancestor of two different important vertices.
You are given a tree with n vertices (1 is the root) and q queries.
Each query is a set of nodes which indicates the unimportant vertices in the tree. Answer the size (i.e. number of vertices) of the auxiliary set for each query.
An auxiliary set is a set containing vertices satisfying at least one of the two conditions:
You are given a tree with n vertices (1 is the root) and q queries.
Each query is a set of nodes which indicates the unimportant vertices in the tree. Answer the size (i.e. number of vertices) of the auxiliary set for each query.
Input
The first line contains only one integer T (T≤1000 ), which indicates the number of test cases.
For each test case, the first line contains two integers n (1≤n≤100000 ), q (0≤q≤100000 ).
In the following n -1 lines, the i-th line contains two integersui,vi(1≤ui,vi≤n) indicating there is an edge between ui i and vi in the tree.
In the next q lines, the i-th line first comes with an integermi(1≤mi≤100000) indicating the number of vertices in the query set.Then comes with mi different integers, indicating the nodes in the query set.
It is guaranteed that∑qi=1mi≤100000 .
It is also guaranteed that the number of test cases in whichn≥1000 or ∑qi=1mi≥1000 is no more than 10.
For each test case, the first line contains two integers n (
In the following n -1 lines, the i-th line contains two integers
In the next q lines, the i-th line first comes with an integer
It is guaranteed that
It is also guaranteed that the number of test cases in which
Output
For each test case, first output one line "Case #x:", where x is the case number (starting from 1).
Then q lines follow, i-th line contains an integer indicating the size of the auxiliary set for each query.
Then q lines follow, i-th line contains an integer indicating the size of the auxiliary set for each query.
Sample Input
16 36 42 55 41 55 33 1 2 31 53 3 1 4
Sample Output
Case #1:363HintFor the query {1,2, 3}:•node 4, 5, 6 are important nodes For the query {5}:•node 1,2, 3, 4, 6 are important nodes•node 5 is the lea of node 4 and node 3 For the query {3, 1,4}:• node 2, 5, 6 are important nodes
Source
2016CCPC东北地区大学生程序设计竞赛 - 重现赛
Recommend
wange2014 | We have carefully selected several similar problems for you: 5932 5931 5930 5929 5928
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5927
题目大意:
T组数据(T<=1000),对于每组数据,N(N<=100000)个点的一棵树,根节点为1,一个点在Set里需要满足下列情况之一:
1.这个点是特殊点 2.这个点是两个特殊点的最近公共祖先(LCA)。
M(M<=100000)个询问,每次询问给一个Q(Q<=N),表示N个点里面有Q个点不是特殊点,接下来是Q个点。求Set里有几个数。
∑Q<=100000,超过1000的N或∑Q的数据组数<=10
题目思路:
【DFS】
首先由于每组数据的树是一样的,先预处理出树的每个节点的深度d[x],父亲fa[x],度s[x](儿子个数,不算子孙)。
接下来对于每一个Q,将Q个数按照深度从深到浅排序,从最深的开始做,c[x]表示c的儿子子树全为非特殊点的个数。
如果当前节点的所有子孙都不是特殊点(c[x]=s[x]),则当前结点也不是特殊点,不需要加入Set,并且将x的父亲y=fa[x]的c[y]++
如果当前节点只有一颗子树含有特殊点,其他子树都不含有特殊点(s[x]-c[x]<=1),则这个点不需要加入Set,但是y=fa[x]的c[y]不加(表示x这个子树中有特殊点)。
////by coolxxx//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<map>#include<stack>#include<queue>#include<set>#include<bitset>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#pragma comment(linker,"/STACK:1024000000,1024000000")#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-10)#define J 10000#define mod 1000000007#define MAX 0x7f7f7f7f#define PI 3.14159265358979323#define N 100004using namespace std;typedef long long LL;double anss;LL aans;int cas,cass;int n,m,lll,ans;int s[N],b[N],c[N],fa[N],last[N],d[N];struct xxx{int to,next;}a[N+N];void add(int x,int y){a[++lll].next=last[x];last[x]=lll;a[lll].to=y;}bool cmp(int a,int b){return d[a]>d[b];}void dfs(int now,int ffa){int i,to;s[now]=1;c[now]=0;d[now]=d[ffa]+1;fa[now]=ffa;for(i=last[now];i;i=a[i].next){to=a[i].to;if(to==ffa)continue;dfs(to,now);s[now]++;}}void work(){int i,x,mm;ans=n;scanf("%d",&mm);for(i=1;i<=mm;i++)scanf("%d",&b[i]);sort(b+1,b+1+mm,cmp);for(i=1;i<=mm;i++){x=b[i];c[x]++;if(s[x]==c[x])c[fa[x]]++;if(s[x]-c[x]<2)ans--;}for(i=1;i<=mm;i++)c[b[i]]=c[fa[b[i]]]=0;printf("%d\n",ans);}int main(){#ifndef ONLINE_JUDGEW//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,k;int x,y,z;//init();//for(scanf("%d",&cass);cass;cass--)for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))//while(~scanf("%d%d",&n,&m)){printf("Case #%d:\n",cass);lll=0;mem(last,0);scanf("%d%d",&n,&m);for(i=1;i<n;i++){scanf("%d%d",&x,&y);add(x,y),add(y,x);}dfs(1,0);for(i=1;i<=m;i++)work();}return 0;}/*////*/
0 0
- HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
- (HDU 5927)Auxiliary Set 思维题 <2016CCPC东北地区大学生程序设计竞赛 - 重现赛 >
- hdu 5927 Auxiliary Set 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 F题(树状dp)
- 2016CCPC东北地区大学生程序设计竞赛 Auxiliary Set (BFSt预处理+ 思维)
- 【HDU5927 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 F】【dfs序 + 线段树 or 树状数组 复杂度计算】Auxiliary Set 一个点如果是好点或是两个好点的LCA就是好
- 2016CCPC东北地区大学生程序设计竞赛
- 2016CCPC东北地区大学生程序设计竞赛
- 2016CCPC东北地区大学生程序设计竞赛-Mr. Frog’s Problem
- 2016CCPC东北地区大学生程序设计竞赛-Minimum’s Revenge
- 2016CCPC东北地区大学生程序设计竞赛-Mr. Frog’s Game
- 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 部分题解
- HDU Minimum’s Revenge 2016CCPC东北地区大学生程序设计竞赛 - 重现赛
- HDU Mr. Frog’s Problem 2016CCPC东北地区大学生程序设计竞赛 - 重现赛
- HDU Mr. Frog’s Game 2016CCPC东北地区大学生程序设计竞赛 - 重现赛
- HDU Basic Data Structure 2016CCPC东北地区大学生程序设计竞赛 - 重现赛
- 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 D Coconuts HDU 5925
- 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 A - Minimum’s Revenge HDU 5922
- HDU 5922 Minimum’s Revenge 【模拟】(2016CCPC东北地区大学生程序设计竞赛)
- html中无法解析php
- 操作系统--处理机调度
- 连接状态查询
- 使用wget在linux系统的开发板上调试程序
- HTML第七章上机练习一
- HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
- linux-搭建java环境
- AndroidStudio/Eclipse真机调试无Log解决办法
- 【sqlserver】 几种中间表实现方式比较(临时表、表变量、CTE)
- 接口测试的感悟
- 【位运算经典应用】 标志位与掩码
- android 基础 res文件 valuse
- 学生学习数据Excel打印流程
- 欢迎使用CSDN-markdown编辑器