题意:

有M个限制,每个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是否有满足的数列。

思路:

看到大牛说是线段树,线段树对于区间操作,印象中乘啊,+啊,-啊都不错,但是并没有就是对于这个位运算就不懂了;

这题的题意就是构造,大致思路是

每条限制是对于每个区间处理就是或上q(可以保证相应的二进制一定是1),然后用线段树处理完m个限制,最后还要询问一下m个限制是否满足;

所以具体操作就是利用线段树进行区间或操作,区间查询且。

PS:

在最后取n个数的时候撒比了,直接取了树上的n个节点位置的数,= =、q[num].x和当left==right的num完全不一样的啊。。哎真踏马蠢了。。

code…

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int N=1e5+10;
  5. struct asd{
  6. int left,right;
  7. int x;
  8. };
  9. asd q[N*4];
  10. struct nod{
  11. int a,b,c;
  12. };
  13. nod temp[N];
  14. void build(int num,int L,int R)
  15. {
  16. q[num].left=L;
  17. q[num].right=R;
  18. if(L==R)
  19. {
  20. q[num].x=0;
  21. return;
  22. }
  23. build(2*num,L,(L+R)/2);
  24. build(2*num+1,(L+R)/2+1,R);
  25. q[num].x=q[2*num].x^q[2*num+1].x;
  26. }
  27. void update(int num,int s,int t,int c)
  28. {
  29. if(s<=q[num].left&&t>=q[num].right)
  30. {
  31. q[num].x|=c;
  32. return;
  33. }
  34. int mid=(q[num].left+q[num].right)/2;
  35. if(mid>=t)
  36. update(2*num,s,t,c);
  37. else if(mid<s)
  38. update(2*num+1,s,t,c);
  39. else
  40. {
  41. update(2*num,s,mid,c);
  42. update(2*num+1,mid+1,t,c);
  43. }
  44. }
  45. int query(int num,int s,int t)
  46. {
  47. if(s<=q[num].left&&t>=q[num].right)
  48. return q[num].x;
  49. int mid=(q[num].left+q[num].right)/2;
  50. if(mid>=t)
  51. return query(2*num,s,t);
  52. else if(mid<s)
  53. return query(2*num+1,s,t);
  54. else
  55. {
  56. return query(2*num,s,mid)&query(2*num+1,mid+1,t);
  57. }
  58. }
  59. vector<int>ans;
  60. void solve(int num)
  61. {
  62. if(num!=1)
  63. {
  64. q[num].x|=q[num/2].x;
  65. }
  66. if(q[num].left==q[num].right)
  67. {
  68. ans.push_back(q[num].x);
  69. return;
  70. }
  71. solve(2*num);
  72. solve(2*num+1);
  73. }
  74. int main()
  75. {
  76. int a,b,c;
  77. int n,m;
  78. scanf("%d%d",&n,&m);
  79. build(1,1,n);
  80. for(int i=1;i<=m;i++)
  81. {
  82. scanf("%d%d%d",&a,&b,&c);
  83. update(1,a,b,c);
  84. temp[i].a=a;
  85. temp[i].b=b;
  86. temp[i].c=c;
  87. }
  88. bool flag=true;
  89. for(int i=1;i<=m;i++)
  90. {
  91. if(query(1,temp[i].a,temp[i].b)!=temp[i].c)
  92. {
  93. flag=false;
  94. break;
  95. }
  96. }
  97. solve(1);
  98. if(flag)
  99. {
  100. puts("YES");
  101. printf("%d",q[1].x);//我直接for一下输出和下面的在vector里面输出为啥顺序不一样。。废话。。踏马这个num是最终子节点么,卧槽。。
  102. for(int i=2;i<=n;i++)
  103. {
  104. printf(" %d",q[i].x);
  105. }
  106. printf("%d",ans[0]);
  107. for(int i=1;i<ans.size();i++)
  108. {
  109. printf(" %d",ans[i]);
  110. }
  111. }
  112. else
  113. puts("NO");
  114. return 0;
  115. }

Codeforces482B【线段树构造】的更多相关文章

  1. [IOI2018]机械娃娃——线段树+构造

    题目链接: IOI2018doll 题目大意:有一个起点和$m$个触发器,给出一个长度为$n$的序列$a$,要求从起点出发按$a$的顺序经过触发器并回到起点(一个触发器可能被经过多次也可能不被经过), ...

  2. CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理

    LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ...

  3. codeforces 671C Ultimate Weirdness of an Array 线段树+构造

    题解上说的很清楚了,我照着写的,表示膜拜题解 然后时间复杂度我觉得应该是O(nlogn),虽然常数略大,预处理和倒着扫,都是O(nlogn) #include <stdio.h> #inc ...

  4. 线段树(segment_tree)

    线段树之——区间修改区间查询 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是 ...

  5. HDU1166 敌兵布阵_线段树

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. 线段树(Segment Tree)(转)

    原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...

  7. LightOJ 1097 - Lucky Number 线段树

    http://www.lightoj.com/volume_showproblem.php?problem=1097 题意:一个自然数序列,先去掉所有偶数项,在此基础上的序列的第二项为3,则删去所有3 ...

  8. lintcode:线段树的构造

    线段树的构造 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 ...

  9. BZOJ4345 POI2016Korale(构造+堆+线段树)

    注意到k与n同阶,考虑构造一种枚举子集的方式,使得尽量先枚举较小的子集.首先sort一下,用堆维护待选子集.每次取出最小子集,并加入:1.将子集中最大数ai替换为ai+1 2.直接向子集中添加ai+1 ...

随机推荐

  1. multiTarget within one project pods manage

    step1:file->new->target create 1 targetstep2:change Podfile and update podstep3:check new targ ...

  2. GCJ Qualification Round 2016 D题

    这题就是找规律.小数据还是挺容易想的.大数据得再深入分析一下. 题意挺绕的. 其实就是字符串转换.字符串只能有两种字母,L或G.给定K和C,就能通过规则生成目标字符串. 那么,如果知道了K和C,以及目 ...

  3. linux SVN 安装配置

    svn服务器有2种运行方式 1.独立服务器 (例如:svn://xxx.com/xxx):2.借助apache.(例如:http://svn.xxx.com/xxx):为了不依赖apache,选择第一 ...

  4. 给js设定一个统一的入口

    javascript是种脚本语言,浏览器下载到哪儿就会运行到哪儿,这样的特性会为编程提供方便,但也easy使程序过于凌乱.支离破碎. js从功能上能够分为两大部分--框架部分和应用部分,框架部分提供的 ...

  5. LuNamp和LuManager的目录结构

    /|---- etc/|-------- my.cnf #mysql配置文件|-------- ipfw.conf #ipfw防火墙的配置文件(仅FreeBSD)|---- home/|------- ...

  6. CSS3学习笔记(5)—页面遮罩效果

    今天把页面遮罩的效果发一下,之前遮罩都是用JS实现的,忽然发现CSS3里面的box-shadow属性除了做立体阴影外,还可以做页面的遮罩. 下面来看一下完成的动态效果: 从上图可以看出,就是当鼠标悬浮 ...

  7. Gym - 101147G G - The Galactic Olympics —— 组合数学 - 第二类斯特林数

    题目链接:http://codeforces.com/gym/101147/problem/G G. The Galactic Olympics time limit per test 2.0 s m ...

  8. The import ....cannot be resolved 解决方法

    1:右击项目build path>configure build path>libraries看有没感叹号什么的不正常的lib,移除掉 2:点击项目的build path>confi ...

  9. BZOJ 1619 [Usaco2008 Nov]Guarding the Farm 保卫牧场:dfs【灌水】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1619 题意: 给你一个n*m的地形图,位置(x,y)的海拔为h[x][y]. 一个山顶的定 ...

  10. Lucene小例子

    package org.itat.test; import java.io.File; import java.io.FileReader; import java.io.IOException; i ...