[CodeChef-LVGFT]Lovers Gift
题目大意:
给定一个$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的更多相关文章
- USACO . Greedy Gift Givers
Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 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 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- 快来玩“Gift大转盘”百分百赚好礼
现在开始到今年的最后一天,你天天都可以来转100%中奖的“ Gift大转盘 ”.代金券.产品折扣.精美纪念礼,没有多余规则.全部网友都可参加,转到就是你赚到,赶快转起来吧! >>活动主页& ...
- Gift Hunting(分组背包)
Gift Hunting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- 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 ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
随机推荐
- Optimize Prime Sieve
/// A heavily optimized sieve #include <cstdio> #include <cstring> #include <algorith ...
- bzoj 2425 [HAOI2010]计数 dp+组合计数
[HAOI2010]计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 451 Solved: 289[Submit][Status][Discus ...
- nginx+webpy+uswgi+jwplayer组合搭建流媒体服务器
转载自:http://blog.csdn.net/cjsafty/article/details/7892392 目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频. ...
- Sencha Touch MVC 中 store 的使用
I have a UserStore that I want to load after succesful login of a user. I can't get this to work i.e ...
- java 身份证15位转18位
/** * 根据身份证号获取性别 * * @param pid * 身份证号 * @return 性别 F为女M为男 */ public static String getSexByPid(Strin ...
- centos yum 安装 mysql
centos7下使用yum安装mysql 时间:2015-03-07 21:26:20 阅读:87445 评论:0 收藏:1 [点我收藏+] 标签: Cen ...
- 转:使用 Nginx Upload Module 实现上传文件功能
普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦.Nginx有一个Upload模块,可以非常简单的实现文件上传功能.此模块的原理是先把用户上传的文件保存到临时 ...
- bzoj3669: [Noi2014]魔法森林 lct版
先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...
- react框架
react 其实react=vue, 区别:vue- 双向数据绑定, react 单向数据绑定. 中文文档:https://react.docschina.org/ 第一步:安装方式,不能直接引入 ...
- 培训补坑(day8:树上倍增+树链剖分)
补坑补坑.. 其实挺不理解孙爷为什么把这两个东西放在一起讲..当时我学这一块数据结构都学了一周左右吧(超虚的) 也许孙爷以为我们是省队集训班... 好吧,虽然如此,我还是会认真写博客(保证初学者不会出 ...