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相关推荐

  1. codeforces EDU segment tree

    本文以codeforces EDU segment tree为资料 content introdcution problems & solutions A. Sign alternation ...

  2. CodeForces - 1624G MinOr Tree(贪心)

    题目链接:点击这里 题目大意: 给定 n n n 个点, m m m 条边的一个图,求该条的最小或运算( or \text{or} or)生成树,即求其生成树中,所有边权或运算之最小的那个生成树 题目 ...

  3. [codeforces] 383C Propagating tree(dfs序+线段树)

    题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...

  4. Codeforces 1276D/1259G Tree Elimination (树形DP)

    题目链接 http://codeforces.com/contest/1276/problem/D 题解 我什么DP都不会做,吃枣药丸-- 设\(f_{u,j}\)表示\(u\)子树内,\(j=0\) ...

  5. Codeforces 1246D/1225F Tree Factory (构造)

    题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...

  6. CodeForces - 343D Water Tree(树链剖分+线段树)

    题目链接: 题目大意:给出一棵由n个点组成的树,初始时每个点的权值为0,接下来有m个操作,每个操作分为以下三种: 1 x:将包括节点x在内的所有子孙节点的权值都改为1 2 x:将包括节点x在内的所有父 ...

  7. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  8. CodeForces 274B Zero Tree :每次选包含1节点的一棵子树,将该子树所有值都+1或者-1最少多少步可以使树值全部为0 :树型dp...

    将1设为树根节点,接下来就好想了,因为更新一个点对应到1的路全部都要更新 对于一个节点u,dfs他的所有儿子节点,返回最大需要+1的操作和最大需要-1的操作 再接合自身返回给父亲节点+1  -1的最大 ...

  9. codeforces 765 E Tree Folding

    传送门 题意:给你一棵树,如果有两条完全相同的链存在则可以关于中间进行折叠,即合成一条链,问你最后剩下的最少的边有多少.不能合并则输出-1 题解:dfs处理,对每一个节点开一个set记录儿子链的长度, ...

最新文章

  1. 第1章 Java语言概述
  2. 第十四届智能车竞赛规则浅聊
  3. ant安装过程,配置过程
  4. linux 获取内核线程数,如何从命令行获取Linux中的CPU /内核数量?
  5. 数据结构源码笔记(C语言):堆排序
  6. 安装 archlinux 之使用 EFI/GPT
  7. 开机自启动脚本_使用xtu降低笔记本(游戏本)cpu电压及功耗·游戏本延时(以及试着解决开机自启动的问题)...
  8. python测试udp端口_怎样测试UDP端口
  9. 【bzoj1565】[NOI2009]植物大战僵尸 【网络流】【最大权闭合子图】
  10. ucc编译器(优化)
  11. TreeView和Menu
  12. Windows 8 Directx 开发学习笔记(九)材质定义及混合光照效果实现
  13. SVN提交文件失败:系统找不到指定路径
  14. 塞班(Symbian)开源了(包括Symbian 3和S60等)
  15. Mybatis plus 修改密码
  16. array_unshift php,php array_unshift函数怎么用?
  17. linux自动登录drcom,Ubuntu用drcom客户端登陆
  18. 码码在线总结——java web开发
  19. android分享微信朋友圈带编辑功能吗,终于被我等到了,微信新版本能编辑别人的朋友圈啦!...
  20. cerebro管理工具中添加elasticsearch字段

热门文章

  1. php5 dm.dll,win10模块dll加载失败二进制怎么解决?
  2. 打叉图标html,网页上一些图标和按钮显示为叉为什么
  3. 2021年CCPC河南省赛部分题解
  4. python 根据网易云歌曲的ID 直接下载歌曲
  5. 代码随想录训练营day1
  6. 【Quarkus】像子弹一样飞的启动速度之入门案例
  7. 记可视化项目代码设计的心路历程以及理解
  8. AG9310与AG9311参数对比和方案选择方法
  9. 计算机实习报告6000字,实习报告6000
  10. JavaScript-学习笔记一