题目链接:https://vjudge.net/problem/CodeForces-1529E

题目大意:给出两棵根节点为 111 的树,分别称为 AAA 树和 BBB 树,现在通过两棵树可以构造出一个无向图,当且仅当点对 (x,y)(x,y)(x,y) 同时满足以下两个条件时,可以在图中建边:

  1. 在 AAA 树中,xxx 是 yyy 的祖先或 yyy 是 xxx 的祖先
  2. 在 BBB 树中,xxx 不能是 yyy 的祖先同时 yyy 不能是 xxx 的祖先

求该图的最大团

题目分析:一开始读错题了,后来读对题后分析的差不多时间也到点了,今天补题的时候发现和赛场的思路差的不算太多,就是一个挺简单的贪心

思考一下,满足最大团的点,在 AAA 树上和 BBB 树上的形态是什么样的,首先这些点在 AAA 树上一定是一条,从根节点到叶子结点的链上的点,可以不连续。在 BBB 树上就可以体现为,所有点的 dfsdfsdfs 序都没有交集

继续分析,所有点的 dfsdfsdfs 序没有交集,也就是说需要选择尽可能多的区间,使其互不相交,这样就将树上的问题转换成线性问题了

而在 AAA 树上需要满足所有的点在同一条链上,在 dfsdfsdfs 的时候贪心选择尽可能多的点就可以了

然后是题目针对于本题输入的一个特殊性质,基于给出的树的输入方式,是每次给出点 iii 的父节点。这也就使得,AAA 树和 BBB 树从根节点拉下来的一条链,一定是一个单调递增的序列,结合于此,针对于 BBB 树的 dfsdfsdfs 序的区间,有一个下面会用到的性质:

序号较小的点的区间,要么包含序号较大的点的区间,要么与其不相交

接下来就可以对 AAA 树 dfsdfsdfs 去贪心了,需要维护一个数据结构,需要实现以下功能:

  1. 插入一个区间
  2. 删除一个区间
  3. 判断存在的区间是否存在交集

可以用平衡树(set),也可以用线段树,我觉得用线段树比较好理解,就选择了线段树实现

当遍历到点 xxx 时,尝试将点 xxx 所代表的区间插入到线段树中,无非会出现三种情况:

  1. [L[x],R[x]][L[x],R[x]][L[x],R[x]] 中原先并没有区间,则直接插入即可
  2. [L[x],R[x]][L[x],R[x]][L[x],R[x]] 被一个更大的区间覆盖,则将其删掉,并替换上点 xxx 所代表的区间显然更优
  3. [L[x],R[x]][L[x],R[x]][L[x],R[x]] 中包含了大于一个区间,此时如果想加入 xxx 所代表的区间,就需要将冲突的区间全都删掉,显然舍弃掉 xxx 所代表的区间是更优的,实际操作就是,无需操作

回溯的时候将 xxx 所代表的区间按照上述三种情况还原即可

最后的最后还有一个比较难解决的小问题,就是,如何快速查询区间 [L[x],R[x]][L[x],R[x]][L[x],R[x]] 中存在的不同区间的个数,以及如何快速更新线段树

还记得前面加粗的性质吗?序号大小这个条件还没有用上呢

其实我们可以直接去查询 [L[x],R[x]][L[x],R[x]][L[x],R[x]] 中,存在的区间的最大编号即可,因为在 AAA 树上 dfsdfsdfs 遍历的链也是递增遍历的,结合加粗的性质,如果 [L[x],R[x]][L[x],R[x]][L[x],R[x]] 之前被覆盖过,那么一定是一个更大的区间覆盖的,所以上述的三种情况里,第三种情况实际上根本不可能出现

代码:

// Problem: E. Trees of Tranquillity
// Contest: Codeforces - Codeforces Round #722 (Div. 2)
// URL: https://codeforces.com/contest/1529/problem/E
// Memory Limit: 256 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
vector<int>a[N],b[N];
int L[N],R[N],dfn,sum,ans;
struct Node {int l,r,mmax,lazy;
}tree[N<<2];
void pushup(int k) {tree[k].mmax=max(tree[k<<1].mmax,tree[k<<1|1].mmax);
}
void pushdown(int k) {if(tree[k].lazy!=-1) {int lz=tree[k].lazy;tree[k].lazy=-1;tree[k<<1].mmax=tree[k<<1|1].mmax=lz;tree[k<<1].lazy=tree[k<<1|1].lazy=lz;}
}
void build(int k,int l,int r) {tree[k]={l,r,0,-1};if(l==r) {return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}
void update(int k,int l,int r,int val) {if(tree[k].l>r||tree[k].r<l) {return;}if(tree[k].l>=l&&tree[k].r<=r) {tree[k].mmax=tree[k].lazy=val;return;}pushdown(k);update(k<<1,l,r,val);update(k<<1|1,l,r,val);pushup(k);
}
int query(int k,int l,int r) {if(tree[k].l>r||tree[k].r<l) {return 0;}if(tree[k].l>=l&&tree[k].r<=r) {return tree[k].mmax;}pushdown(k);return max(query(k<<1,l,r),query(k<<1|1,l,r));
}
void dfs1(int u) {L[u]=++dfn;for(auto v:b[u]) {dfs1(v);}R[u]=dfn;
}
void dfs2(int u) {int mmax=query(1,L[u],R[u]);if(!mmax) {update(1,L[u],R[u],u);sum++;} else {update(1,L[mmax],R[mmax],0);update(1,L[u],R[u],u);}ans=max(ans,sum);for(auto v:a[u]) {dfs2(v);}if(!mmax) {update(1,L[u],R[u],0);sum--;} else {update(1,L[u],R[u],0);update(1,L[mmax],R[mmax],mmax);}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--) {int n;read(n);dfn=0;for(int i=1;i<=n;i++) {a[i].clear();b[i].clear();}for(int i=2;i<=n;i++) {int fa;read(fa);a[fa].push_back(i);}for(int i=2;i<=n;i++) {int fa;read(fa);b[fa].push_back(i);}dfn=ans=sum=0;build(1,1,n);dfs1(1);dfs2(1);cout<<ans<<endl;}return 0;
}

CodeForces - 1529E Trees of Tranquillity(贪心+线段树)相关推荐

  1. CF 1529E. Trees of Tranquillity

    CF 1529E. Trees of Tranquillity 文章目录 题意: 题解: 代码: 线段树代码: 利用set实现 题意: 有A1,A2两棵树,根是1,编号都是1~n,先制作图A3,如果两 ...

  2. CF1526C2 Potions (Hard Version) (贪心 + 线段树)

    题目链接: Potions (Hard Version) 大致题意 有n个数, 编号从1~n, 第i个位置的值为a[i]. 从编号为1的数字开始选择, 一直到编号为n的数字. 对于第i个数字, 你可以 ...

  3. Codeforces 1004F Sonya and Bitwise OR (线段树)

    题目链接 https://codeforces.com/contest/1004/problem/F 题解 这种水题都不会做了怎么.. 考虑一个序列的前缀 \(\text{or}\) 值只会变化 \( ...

  4. [九省联考2018]IIIDX 贪心 线段树

    ~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...

  5. BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)

    题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...

  6. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

  7. 【贪心 / 线段树模拟费用流增广】BZOJ4977 [Lydsy八月月赛] 跳伞求生

    [题目] 原题地址 有nn个队友和mm个敌人,每个队友有一个攻击力aia_i,每个敌人有攻击力bib_i和价值cic_i.你可以选择若干个队友,每个队友ii分别去怼一个敌人jj,当ai>bja_ ...

  8. BSOJ4851:攻略 贪心+线段树

    4851 -- [模拟试题]攻略 Description 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景 ...

  9. 【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)

    http://new.tyvj.cn/p/2065 我就不说我很sb的用线段树来维护值...... 本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法.最后一小时才想出来线段树(果 ...

最新文章

  1. 《实施Cisco统一通信VoIP和QoS(CVOICE)学习指南(第4版)》一导读
  2. Window VNC远程控制LINUX:VNC详细配置介绍
  3. nginx的url重写[rewrite规则和参考]
  4. USB驱动程序之概念介绍学习笔记
  5. [云炬创业基础笔记] 第四章测试14
  6. pythonjs设置_python dom操作
  7. webpack 4.14.0 版本太高,无法执行相关指令,(将webpack高版本切换到低版本)--直接覆盖
  8. 明年的现在我也想去“双选会”应聘!
  9. 如何成为像 Facebook 创始人马克·扎克伯格一样的大佬?
  10. SQL基本语法 case when 应用
  11. NUC1131 Triangle【DP】
  12. python爬虫-《笔趣看》网小说《悟空看私聊》
  13. USACO 2007 Dec Silver Mud Puddles bfs or A-star
  14. MATLAB中图像增强之伪彩色增强
  15. vue中下载文件使用file-saver,文件错误excel无法打开
  16. 达人评测 联想小新Pro16和小米笔记本Pro15选哪个好
  17. C++学习——布尔型,操作符别名,函数和引用
  18. win10+VS2017编译配置boost_1_78_0
  19. 扫描网段找出树莓派IP
  20. 2020西工大c语言程序设计在线作业答案,西工大16秋《C语言程序设计》在线作业答案...

热门文章

  1. bootstrap 固定最底部_bootstrap 固定底部导航自适应
  2. 根目录android结构,android系统盘根目录中的(文件)谁给讲一下是干什么的?
  3. mysql autoextend_innodb_autoextend_increment':问题解决方法
  4. Nginx静态资源优化配置之tcp_nopush和tcp_nodelay
  5. Nginx服务的命令行控制
  6. Hystrix仪表盘解释
  7. 设计模式在Netty 中的应用-策略模式源码举例
  8. ArrayBlockingQueue原理分析-put方法
  9. 微服务网关路由过滤作用介绍
  10. request获得请求参数