【2016东北四省赛】

HDU5927

题意:给出一个根节点为1的树(n <= 100000),树中的结点分为重要结点与不重要结点。

有q个询问,每次询问给出一个不重要结点的集合(m <= 100000), 统计一类点(它是重要结点 或者 它是两个重要结点的最近公共祖先) 的总数。

题解:维护一个set集合表示以该结点为根的子树不含重要结点,set集合初始即为m个点。按 后序遍历 将集合中的点排序后(ra表示结点后序遍历中的排名),对每个点,查找子结点点,若至少有两个子结点不在set里,则该点是可行点,同时将其从集合中删除。

复杂度分析:每次询问的复杂度为O(mlogm)

time: 1794MS

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e5+10;
 4 vector<int> ve[N];
 5 int ra[N], tot;
 6 void dfs(int f, int x){
 7     for(int i = 0; i < ve[x].size(); i++){
 8         int y = ve[x][i];
 9         if(y == f) continue ;
10         dfs(x, y);
11     }
12     ra[x] = tot++;
13 }
14 bool cmp(int a, int b){
15     return ra[a] < ra[b];
16 }
17
18
19 int temp[N];
20 int tag[N];
21 int main(){
22     int t, ca = 1; scanf("%d", &t);
23     while(t--){
24         int n, q, u, v; scanf("%d%d", &n, &q);
25         for(int i = 1; i < n; i++){
26             scanf("%d%d", &u, &v);
27             ve[u].push_back(v);
28             ve[v].push_back(u);
29         }
30         tot = 0;
31         dfs(0, 1);
32         printf("Case #%d:\n", ca++);
33         while(q--){
34             int m, x; scanf("%d", &m);
35             for(int i = 0; i < m; i++)
36                 scanf("%d", temp+i);
37             sort(temp, temp+m, cmp);
38             set<int> se;
39             for(int i = 0; i < m; i++)
40                 se.insert(temp[i]);
41             int ans = 0;
42             for(int i = 0; i < m; i++){
43                 int x = temp[i], sum = 0;
44                 for(int j = 0; j < ve[x].size(); j++){
45                     int y = ve[x][j];
46                     if(ra[y] > ra[x]) continue;
47                     if(se.find(y) == se.end()){
48                         sum++;
49                         if(sum > 1){
50                             ans++;
51                             break;
52                         }
53                         se.erase(x);
54                     }
55                 }
56             }
57             printf("%d\n", n-m+ans);
58         }
59         for(int i = 1; i <= n; i++)
60             ve[i].clear();
61     }
62     return 0;
63 }
时间: 2024-10-18 06:18:00

【2016东北四省赛】的相关文章

2014东北四省赛

这次运气真好...要是区域赛也有这样的运气就好了. 怎么说呢,这次比赛事实上有非常多不尽人意的地方,比方不给发气球,不给判题,判错题,题目描写叙述有问题,题目数据有问题,和不给判题等等.. 热身赛,上来提前发了题目,然后发现pc^2上不去...这尼玛,深深的恶意啊,赶快边敲题目边叫来志愿者.还好搞了搞就能连上了. 热身赛果然是用来热身的啊.队友C题仅仅看了两个单词就发现是原题.然后就交了..后来就顺着把题目A掉了.简直的二分专场啊,除了签到题和两道原题,剩下的两道题都是二分...凭借两道原题,热

18年第十二届东北四省赛

18年第十二届东北四省赛 5.19晚上的东北四省赛的热身赛老师说不用参加,当时白天打了一场之后,也确实脑壳疼QAQ: 5.20很吉利的日期啊,9.30-2.30,还是一样的分工读题,外加看榜,然后很幸运,两道水题,一道A,一道K,队友直接听我们的上去敲,然后交的时候比较谨慎,0罚时,连A两题,然后挂机4小时40分钟?!然后我们讨论了B,然后就一直B....当时觉得B转换为二进制没问题,后来WA,发现有个地方爆Long long,然后又发现有个地方爆Long long,然后把乘法改成除法感觉不会爆

2019年东北四省赛感想

打完东北四省赛之后一直都没空,然后到了放假的时候才有空闲下来,写了这篇感想. 今年的东北四省赛的地点在吉林省的吉林市 ,在东北电力大学,不得不说东北电力大学的伙食还可以,量很足.今年东北四省赛的出题人是杭电的大佬,出了一堆数据不好处理的题,今年的题,比去年的题还要难,1道题手速快点就是铜了,2道题稳铜,4道题手速快是银牌.今年的牌做的挺大的.比赛过程中完全被榜给带偏了,有一道简单题,我们都没有看,有时候跟榜害死人啊,比赛过程中,签到题,8分钟就过了,然后就一直在处理有一道题的数据,那一道题的数据

2019 东北四省赛 A. Apple Business

link 简要题意:给一颗\(n\)个点的二叉树,par[i]=i/2,每个点有\(a[i]\)个果实,有\(m\)次操作,每次在\(u\to v\)(保证\(u\)是\(v\)的祖先)中取不超过\(c\)个果实,每取一个贡献\(w\)的收益 首先可以暴力建边然后费用流.考虑优化,有一种显然的贪心策略:按照\(w\)从大到小依次尽量选最多,判断可以二分加二分图匹配. 考虑霍尔定理,相当于对于任意子集的并,\(\sum _{i \in S} a[i] \ge \sum _{u_i\in S \&

2016 CCPC 东北地区重现赛

1. 2016 CCPC 东北地区重现赛 2.总结:弱渣,只做出01.03.05水题 08   HDU5929 Basic Data Structure    模拟,双端队列 1.题意:模拟一个栈的操作,并在每次询问时,计算栈项到栈底元素nand位运算的值. 2.总结:思路就是看距离栈底最近的0的后面1的个数的奇偶.试了好多种办法,最后还是双端队列简便.总之,贼恶心的题.. #include<iostream> #include<cstring> #include<cmath

【2016北京集训测试赛(八)】 crash的数列

Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多点数列套着来加速转移呢? 但是发现好像太多数列套起来是可以烦死人的...... 我们就采用嵌套两次吧,记原数列为A,第一层嵌套为B,第二层嵌套为C. 我们其实可以发现一些规律,对于Ci,它对应了B中i的个数:对于Bi,它对应了A中i的个数. 稍加处理即可,我们一边计算一边模拟数列的运算,同时可以计算

2016蓝桥杯省赛C/C++A组第八题 四平方和

题意: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法. 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序

省赛,四省赛总结2

省赛有五道题是水题,我敲的是一个很裸的数位dp,能拿到关键一题的ac主要还是运气,据说是裁判的回答把所有人都误导了,然后我们没看message….于是拿了冠军.还是运气的成分多一些. 第二天的时候两个队友都感冒了,能明显的看出亮哥精神不太好,由于前一天的比赛,比赛后期的时候我也有一种脑袋懵掉了的感觉,三个分别都出现了小失误,幸好交流不错,把小bug都改掉了,最后有道思路很清晰的题时间不够了,没有敲完.要是没有第一天省赛我觉得我们应该能拿前5. 我觉得需要注意的就是状态的保持,这次东北赛三个人状态

2014东北农大校赛--A. Paint it! (预处理)

1141: A.Paint it! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 13  Solved: 10 [Submit][Status][Web Board] Description 有一个n*m的棋盘,每个格子只可能是黑和白两种颜色,你可以使用染料将某个格子染成黑色或者白色.求最少需要染多少个格子, 能使当前的棋盘变成类似于国际象棋的棋盘(每个格子临边的四个格子颜色都不与该格子的颜色相同). Input n m(n,m<=100) 接下