or

【描述】

构造一个长度为 n 的非负整数序列 x,满足 m 个条件,第 i 个条件为x[li] | x[li+1] | … | x[ri]=pi。

【输入】

第一行两个整数 n,m。接下来 m 行每行三个整数 li,ri,pi。

【输出】

如果存在这样的序列 x,第一行输出 Yes,第二行输出 n 个不超过 2^30-1 的非负整数表示x[1]~x[n],否则输出一行 No

【输入样例 1】

2 1

1 2 1

【输出样例 1】

2 1

1 2 1

【子任务】

对于 30%的数据,n,m<=1000。

对于另外 30%的数据,pi<=1。

对于 100%的数据,n,m<=100000,1<=li<=ri<=n,0<=pi<2^30。

我承认这是sb线段树,考试的时候被毒了一波debuff,居然想到用二进制拆位给线段树加了一个30的常数。。。

于是被卡了40分。。。

事实上按位与或对于每一位二进制位是独立的,因此可以将30的常数去掉。

本机跑的飞快。。。

代码:

  1. #include<bits/stdc++.h>
  2. #define inf ((1<<30)-1)
  3. #define lc (p<<1)
  4. #define rc (p<<1|1)
  5. #define mid (T[p].l+T[p].r>>1)
  6. #define N 100005
  7. using namespace std;
  8. inline int read(){
  9. int ans=0;
  10. char ch=getchar();
  11. while(!isdigit(ch))ch=getchar();
  12. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  13. return ans;
  14. }
  15. inline void write(int x){
  16. if(x>9)write(x/10);
  17. putchar(x%10^48);
  18. }
  19. int n,m,L[N],R[N],P[N];
  20. struct Node{int l,r,sum;}T[N<<2];
  21. inline void pushup(int p){T[p].sum=T[lc].sum|T[rc].sum;}
  22. inline void pushnow(int p,int v){T[p].sum&=v;}
  23. inline void pushdown(int p){pushnow(lc,T[p].sum),pushnow(rc,T[p].sum);}
  24. inline void build(int p,int l,int r){
  25. T[p].l=l,T[p].r=r;
  26. if(l==r){T[p].sum=inf;return;}
  27. build(lc,l,mid),build(rc,mid+1,r),pushup(p);
  28. }
  29. inline void update(int p,int ql,int qr,int v){
  30. if(ql>T[p].r||qr<T[p].l)return;
  31. if(ql<=T[p].l&&T[p].r<=qr)return pushnow(p,v);
  32. pushdown(p);
  33. if(qr<=mid)update(lc,ql,qr,v);
  34. else if(ql>mid)update(rc,ql,qr,v);
  35. else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
  36. pushup(p);
  37. }
  38. inline int query(int p,int ql,int qr){
  39. if(ql>T[p].r||qr<T[p].l)return 0;
  40. if(ql<=T[p].l&&T[p].r<=qr)return T[p].sum;
  41. pushdown(p);
  42. if(qr<=mid)return query(lc,ql,qr);
  43. if(ql>mid)return query(rc,ql,qr);
  44. return query(lc,ql,mid)|query(rc,mid+1,qr);
  45. }
  46. inline void solve(int p){
  47. if(T[p].l==T[p].r){write(T[p].sum),putchar(' ');return;}
  48. pushdown(p);
  49. solve(lc),solve(rc);
  50. }
  51. int main(){
  52. freopen("or.in","r",stdin);
  53. freopen("or.out","w",stdout);
  54. n=read(),m=read();
  55. bool f=true;
  56. build(1,1,n);
  57. for(int i=1;i<=m;++i){
  58. L[i]=read(),R[i]=read(),P[i]=read();
  59. update(1,L[i],R[i],P[i]);
  60. }
  61. for(int i=1;i<=m;++i){
  62. int tmp=query(1,L[i],R[i]);
  63. if((tmp&P[i])!=P[i]){f=false;break;}
  64. }
  65. if(!f){puts("No");return 0;}
  66. puts("Yes");
  67. solve(1);
  68. return 0;
  69. }

2018.08.22 NOIP模拟 or(线段树)的更多相关文章

  1. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  2. 2018.08.22 NOIP模拟 shop(lower_bound+前缀和预处理)

    Shop 有 n 种物品,第 i 种物品的价格为 vi,每天最多购买 xi 个. 有 m 天,第 i 天你有 wi 的钱,你会不停购买能买得起的最贵的物品.你需要求出你每天会购买多少个物品. [输入格 ...

  3. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  4. 2018.08.30 NOIP模拟 graph(dfs序/树剖+线段树)

    [描述] 给你一个图,一共有 N 个点,2*N-2 条有向边. 边目录按两部分给出 1. 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点 到达. 2. 接下来的 N ...

  5. 2018.08.30 NOIP模拟 wall(模拟)

    [问题描述] 万里长城是中国强大的标志,长城在古代的用途主要用于快速传递军事消息和抵御 外敌,在长城上的烽火台即可以作为藏兵的堡垒有可以来点燃狼烟传递消息. 现在有一段 万里长城,一共有 N 个烽火台 ...

  6. 2018.08.22 codves2370 小机房的树(lca+树上差分)

    传送门 一道板子题. 直接树链剖分维护树上lca然后差分就行了. 代码: #include<bits/stdc++.h> #define N 50005 #define lc (p< ...

  7. 2018.08.19 NOIP模拟 change(简单模拟)

    Change 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 Alice 和 Bob 又聚在一起了!他们已经厌倦了取石子游戏,现在他们热衷于切题.于是,Alice 找到了一道题让 B ...

  8. 2018.08.30 NOIP模拟 kfib(矩阵快速幂+exgcd)

    [输入] 一行两个整数 n P [输出] 从小到大输出可能的 k,若不存在,输出 None [样例输入 1] 5 5 [样例输出] 2 [样例解释] f[0] = 2 f[1] = 2 f[2] = ...

  9. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

随机推荐

  1. as3 typeof 对象类型与返回结果对照表 is as

    is 和as 运算符使用很广泛.is 用来判断一个对象是否属于一种类型,返回布尔值,true 代表属于,false 表示不属于.使用格式如下:trace (9 is Number); //输出:tru ...

  2. 前端-CSS-6-盒子模型

    上面的布局宽度div{ width: 200px; height: 200px; border: 10px solid red; padding: 20px; } ------------------ ...

  3. WP runtime post 请求, json 解析

    https://monkeyweekend.wordpress.com/2014/10/23/how-to-send-text-json-or-files-using-httpclient-posta ...

  4. ASP.Net 下载大文件的实现

    当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 1. 将数据分成较小的部分,然后将其移 ...

  5. Pandas缺失数据处理

    Pandas缺失数据处理 Pandas用np.nan代表缺失数据 reindex() 可以修改 索引,会返回一个数据的副本: df1 = df.reindex(index=dates[0:4], co ...

  6. Anaconda中python加入环境变量

    1.我的电脑---高级系统设置 2.选中环境变量,保存. 3.在系统环境变量PATH中,加入Anaconda3及Script路径加入其中 4.测试python

  7. airway之workflow

    1)airway简介 在该workflow中,所用的数据集来自RNA-seq,气道平滑肌细胞(airway  smooth muscle cells )用氟美松(糖皮质激素,抗炎药)处理.例如,哮喘患 ...

  8. like模糊查询

    1. ${}获取值,直接连接 name like '%${search_content}%' 2.CONCAT()函数 MySQL的 CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的m ...

  9. xpath定位--绝对与相对的定位

    xpath定位--绝对与相对的定位: xpath定位即为xml路径语言,它是一种用来确定xml文档中某部分位置的语言,xpath基于xml的树状结构,提供在数据结构中找寻节点的能力 xpath的相对定 ...

  10. linux 用户管理(3)----查看用户登录时间以及命令历史

    1.查看当前登录用户信息 who命令: who缺省输出包括用户名.终端类型.登陆日期以及远程主机. who /var/log/wtmp 可以查看自从wtmp文件创建以来的每一次登陆情况 (1)-b:查 ...