题目大意:
  给定一个$n(n\le10^5)$个结点的树,初始全为白点。$m(m\le10^5)$次操作,每次将点$x$染成黑色或询问从$x$出发至少经过一个黑点能到达的点中,编号次大的点。

思路:
  将操作倒序处理,即原操作变为擦除颜色和询问两种操作。用并查集维护白点连通块和若干单独的黑点。记录每个连通块或黑点出发至少经过一个黑点能到达的点中,能到达的最大和次大的点。擦除黑点时进行合并即可。维护最大、次大点时选择答案较小的连通块暴力递减。递减次数加起来是$n$。初始时每个连通块维护的最大值都是$n$,次大值都是$n-1$。而只有当连通块的点中含有$n$或$n-1$时,答案才会变小。每次合并时从两个连通块中答案比较小的往下枚举,总共最多枚举$2n$次。时间复杂度$O((n+m)\alpha(n)$比标算不知道高到哪里去了。

 #include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e5+,M=1e5+;
struct Edge {
int to,next;
};
Edge e[N<<];
int h[N],b[N],ans[N];
inline void add_edge(const int &u,const int &v) {
e[++h[]]=(Edge){v,h[u]};h[u]=h[];
e[++h[]]=(Edge){u,h[v]};h[v]=h[];
}
std::pair<bool,int> q[M];
struct DisjointSet {
int anc[N];
void reset(const int &n) {
for(register int i=;i<=n;i++) anc[i]=i;
}
int find(const int &x) {
return x==anc[x]?x:anc[x]=find(anc[x]);
}
void merge(const int &x,const int &y) {
anc[find(x)]=find(y);
}
bool same(const int &x,const int &y) {
return find(x)==find(y);
}
};
DisjointSet s;
std::pair<int,int> max[N];
inline void maintain(const int &x) {
while(max[x].first&&s.same(x,max[x].first)) max[x].first--;
max[x].second=std::max(std::min(max[x].second,max[x].first-),);
while(max[x].second&&s.same(x,max[x].second)) max[x].second--;
}
int main() {
for(register int T=getint();T;T--) {
const int n=getint(),m=getint();
std::fill(&h[],&h[n]+,-);
for(register int i=;i<n;i++) {
add_edge(getint(),getint());
}
for(register int i=;i<=m;i++) {
const bool opt=getint()&;
const int x=getint();
if(opt&&!b[x]) b[x]=i;
q[i]={opt,x};
}
s.reset(n);
std::fill(&max[],&max[n]+,std::make_pair(n,n-));
for(register int i=;i<=n;i++) {
if(!b[i]) maintain(i);
}
for(register int x=;x<=n;x++) {
if(b[x]) continue;
for(register int i=h[x];~i;i=e[i].next) {
const int &y=e[i].to;
if(b[y]||s.same(x,y)) continue;
max[s.find(y)]=std::min(max[s.find(y)],max[s.find(x)]);
s.merge(x,y);
maintain(s.find(x));
}
}
for(register int i=m;i;i--) {
const bool opt=q[i].first;
const int x=q[i].second;
if(opt&&b[x]==i) {
b[x]=;
maintain(s.find(x));
for(register int i=h[x];~i;i=e[i].next) {
const int &y=e[i].to;
if(b[y]||s.same(x,y)) continue;
max[s.find(y)]=std::min(max[s.find(y)],max[s.find(x)]);
s.merge(x,y);
maintain(s.find(x));
}
}
if(!opt) {
ans[i]=max[s.find(x)].second?:-;
}
}
for(register int i=;i<=m;i++) {
if(!q[i].first) printf("%d\n",ans[i]);
}
}
return ;
}

[CodeChef-LVGFT]Lovers Gift的更多相关文章

  1. USACO . Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  2. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  3. CF# Educational Codeforces Round 3 B. The Best Gift

    B. The Best Gift time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  5. 快来玩“Gift大转盘”百分百赚好礼

    现在开始到今年的最后一天,你天天都可以来转100%中奖的“ Gift大转盘 ”.代金券.产品折扣.精美纪念礼,没有多余规则.全部网友都可参加,转到就是你赚到,赶快转起来吧! >>活动主页& ...

  6. Gift Hunting(分组背包)

    Gift Hunting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  8. Codeforces Educational Codeforces Round 3 B. The Best Gift 水题

    B. The Best Gift 题目连接: http://www.codeforces.com/contest/609/problem/B Description Emily's birthday ...

  9. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

随机推荐

  1. centos关闭ipv6

    1.使用lsmod查看ipv6的模块是否被加载. lsmod | grep ipv6 [root@dmhadoop011 ~]# lsmod | grep ipv6 ipv6              ...

  2. MyBatis的SQL语句映射文件详解(三)----多参数传递的几种方式

    1.单一基本类型参数(String,int等) 单一的基本类型参数,将对应语句中的parameterType的值与参数的类型相同.然后直接 用“#{参数名}” 来获取 java代码 //String类 ...

  3. HDU3790---(双权最短路径)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. bzoj1574 [Usaco2009 Jan]地震损坏Damage

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1574 [题解] 贪心把report的点的旁边所有点破坏即可. # include <s ...

  5. 1210笔记//关于导航实例-QQ空间//导航实例-storyboard实现//控制器的生命周期//控制器的生命周期方法

      一.利用storyboard完成导航1.storyboard中用来跳转的每一根线 都是 一个 UIStoryboardSegue对象1> 自动跳转 (从 某个按钮 拖线到 下一个目的控制器) ...

  6. bzoj 1051 tarjan强连通分量

    2013-11-16 11:39 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1051 强连通分量,缩完点之后看出度为0的强连通分量有几个 ...

  7. Python用户登陆

    #!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__:Dahlhin import sys userinfo = r'userinfo.txt ...

  8. 原型和JS内置对象

    原型 1.定义 每一个对象都有原型 原型仍然是一个对象 模拟实现面向对象的继承性 2.原型链 对象的原型还有原型 对象除了可以使用自有属性还可以继承原型上的属性 3.获取原型 对象.__proto__ ...

  9. WEB字体,多列布局和伸缩盒

    WEB字体 语法 @font-face{ font-family:""; src:url() format() ... } 兼容性写法 @font-face { font-fami ...

  10. SSH Secure Shell 无法登录:server responded "algorithm negotiation failed”

    SSH Secure Shell Client 连接 ubuntu系统报错 修改ssh的配置文件 /etc/ssh/sshd_config在配置文件中添加: Ciphers aes128-cbc,ae ...