Codeforces 513D2 Constrained Tree
Constrained Tree
没写出来好菜啊啊。
首先根据输入我们能算出某些节点的左儿子的范围, 右儿子的范围(此时并不准确)
然后我们在划分u这个节点的时候我们从左右开始用树状数组check每一个点是否可行, 即这个点没有被覆盖,
因为左右同时开始所以复杂度是nlognlogn,以前做过这种从两头开始check的。
还有一种方法用线段树, 从n - > 1取更新每个点的准确范围,然后直接输出答案。
还有一种方法是dfs的过程中, 先给所子树划分一个区域, 这个区域可能是不对的,然后递归左子树, 能到正确的区域才去递归右子树。
#include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ALL(x) (x).begin(), (x).end() #define fio ios::sync_with_stdio(false); cin.tie(0); using namespace std;const int N = 1e6 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-8; const double PI = acos(-1);template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;} template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;} template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;} template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;}struct Bit {int a[N];void modify(int x, int v) {for(int i = x; i < N; i += i & -i)a[i] += v;}int sum(int x) {int ans = 0;for(int i = x; i; i -= i & -i)ans += a[i];return ans;} };int n, m; char s[10]; vector<PII> vc[N]; vector<int> ans; Bit bit;void dfs(int l, int r) {if(l > r) return;if(l == r) {ans.push_back(l);return;}int L = l, R = r;for(auto& t : vc[l]) {if(t.se) chkmin(R, t.fi - 1);else chkmax(L, t.fi);bit.modify(l, -1);bit.modify(t.fi, 1);}for( ; L <= R; L++, R--) {if(!bit.sum(L)) {dfs(l + 1, L);ans.push_back(l);dfs(L + 1, r);return;}if(!bit.sum(R)) {dfs(l + 1, R);ans.push_back(l);dfs(R + 1, r);return;}}puts("IMPOSSIBLE");exit(0); }int main() {scanf("%d%d", &n, &m);for(int i = 1; i <= m; i++) {int a, b;scanf("%d%d%s", &a, &b, s);if(b <= a) {puts("IMPOSSIBLE");return 0;}if(s[0] == 'L') vc[a].push_back(mk(b, 0));else vc[a].push_back(mk(b, 1));bit.modify(a, 1);bit.modify(b, -1);}dfs(1, n);for(auto& t : ans) printf("%d ", t);puts("");return 0; }/* */
转载于:https://www.cnblogs.com/CJLHY/p/10735316.html
Codeforces 513D2 Constrained Tree相关推荐
- codeforces EDU segment tree
本文以codeforces EDU segment tree为资料 content introdcution problems & solutions A. Sign alternation ...
- CodeForces - 1624G MinOr Tree(贪心)
题目链接:点击这里 题目大意: 给定 n n n 个点, m m m 条边的一个图,求该条的最小或运算( or \text{or} or)生成树,即求其生成树中,所有边权或运算之最小的那个生成树 题目 ...
- [codeforces] 383C Propagating tree(dfs序+线段树)
题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...
- Codeforces 1276D/1259G Tree Elimination (树形DP)
题目链接 http://codeforces.com/contest/1276/problem/D 题解 我什么DP都不会做,吃枣药丸-- 设\(f_{u,j}\)表示\(u\)子树内,\(j=0\) ...
- Codeforces 1246D/1225F Tree Factory (构造)
题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...
- CodeForces - 343D Water Tree(树链剖分+线段树)
题目链接: 题目大意:给出一棵由n个点组成的树,初始时每个点的权值为0,接下来有m个操作,每个操作分为以下三种: 1 x:将包括节点x在内的所有子孙节点的权值都改为1 2 x:将包括节点x在内的所有父 ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- CodeForces 274B Zero Tree :每次选包含1节点的一棵子树,将该子树所有值都+1或者-1最少多少步可以使树值全部为0 :树型dp...
将1设为树根节点,接下来就好想了,因为更新一个点对应到1的路全部都要更新 对于一个节点u,dfs他的所有儿子节点,返回最大需要+1的操作和最大需要-1的操作 再接合自身返回给父亲节点+1 -1的最大 ...
- codeforces 765 E Tree Folding
传送门 题意:给你一棵树,如果有两条完全相同的链存在则可以关于中间进行折叠,即合成一条链,问你最后剩下的最少的边有多少.不能合并则输出-1 题解:dfs处理,对每一个节点开一个set记录儿子链的长度, ...
最新文章
- 第1章 Java语言概述
- 第十四届智能车竞赛规则浅聊
- ant安装过程,配置过程
- linux 获取内核线程数,如何从命令行获取Linux中的CPU /内核数量?
- 数据结构源码笔记(C语言):堆排序
- 安装 archlinux 之使用 EFI/GPT
- 开机自启动脚本_使用xtu降低笔记本(游戏本)cpu电压及功耗·游戏本延时(以及试着解决开机自启动的问题)...
- python测试udp端口_怎样测试UDP端口
- 【bzoj1565】[NOI2009]植物大战僵尸 【网络流】【最大权闭合子图】
- ucc编译器(优化)
- TreeView和Menu
- Windows 8 Directx 开发学习笔记(九)材质定义及混合光照效果实现
- SVN提交文件失败:系统找不到指定路径
- 塞班(Symbian)开源了(包括Symbian 3和S60等)
- Mybatis plus 修改密码
- array_unshift php,php array_unshift函数怎么用?
- linux自动登录drcom,Ubuntu用drcom客户端登陆
- 码码在线总结——java web开发
- android分享微信朋友圈带编辑功能吗,终于被我等到了,微信新版本能编辑别人的朋友圈啦!...
- cerebro管理工具中添加elasticsearch字段