题面


【题目描述】
你需要构造一个长度为 n 的数列 X,当中的数字范围从 0 到 2^30-1。除此之外你需要
满足 m 个条件,第 i 个条件为 X[li]|X[li+1]|……|X[ri]=pi。|为按位或运算。
【输入描述】
第一行输入两个整数 n,m
接下来的 m 行每行输入三个整数 li,ri,pi
【输出描述】
如果存在这样的序列,第一行输出 Yes,否则输出 No。
如果存在这样的序列,第二行输出 n 个数,为数列 X。
【样例】
输入
2 1
1 2 1

输出
Yes
1 1
【数据范围】
对于 30%的数据,n,m<=1000。
对于另外 30%的数据,pi<=1。
对于 100%的数据,n,m<=100000,1<=li<=ri<=n,0<=pi<2^30。

题解


又是一道位运算的题目(感觉是最简单的一道……)

题意还是比较清楚的,这里不细说了。

"对于另外30%的数据",出题人在这里是不是给了一个小小的提示?

众所周知,位运算有一个性质,即对于每一个位是独立的,因此想到分开考虑每个位的情况。

对于每个条件的pi的每一位,如果这一位为0,那么这个区间内所有的数的这一位显然都为0。

因此想到如下做法:

先把数列内所有数设为230-1。

对于每个条件的pi的每一位,如果这一位为0,那么将该区间内所有数的这一位置0,最后判断每个条件是否成立即可。

用线段树维护数列,只需记录区间内所有数的或即可。复杂度O(mlog2n)

具体细节见代码。关于位运算的操作,这里不多说了。

代码


 #include <stdio.h>
#define N 100010
#define reg register
const int pv=(<<)-;
int n,m,l[N],r[N],a[N];
struct node{int o,l;}t[];
void build(int l,int r,int k) {
t[k].o=pv;t[k].l=;
if(l!=r) {
build(l,l+r>>,k<<);
build((l+r>>)+,r,k<<|);
}
}
void pushdown(int k) {
reg int x=t[k].l;
t[k<<].o&=~x;
t[k<<].l|=x;
t[k<<|].o&=~x;
t[k<<|].l|=x;
t[k].l=;
}
void setzero(int l,int r,int a,int b,int c,int k) {
if(l==a&&r==b) {
t[k].o&=~c;t[k].l|=c;
return;
}
pushdown(k);
reg int mid=l+r>>;
if(b<=mid) setzero(l,mid,a,b,c,k<<);
else if(a>mid) setzero(mid+,r,a,b,c,k<<|);
else {
setzero(l,mid,a,mid,c,k<<);
setzero(mid+,r,mid+,b,c,k<<|);
}
}
int query(int l,int r,int a,int b,int k) {
if(l==a&&r==b) return t[k].o;
pushdown(k);
reg int mid=l+r>>;
if(b<=mid) return query(l,mid,a,b,k<<);
else if(a>mid) return query(mid+,r,a,b,k<<|);
else {
return query(l,mid,a,mid,k<<)|query(mid+,r,mid+,b,k<<|);
}
}
void output(int l,int r,int k) {
if(l==r) {
printf("%d ",t[k].o);
return;
}
pushdown(k);
output(l,l+r>>,k<<);
output((l+r>>)+,r,k<<|);
}
int main() {
scanf("%d%d",&n,&m);
build(,n,);
for(int i=;i<m;++i) {
scanf("%d%d%d",l+i,r+i,a+i);
setzero(,n,l[i],r[i],~a[i],);
}
for(int i=;i<m;++i) {
if(query(,n,l[i],r[i],)!=a[i]) {
puts("No");
return ;
}
}
puts("Yes");
output(,n,);
return ;
}

2017-10-22模拟赛T2 或(or.*)的更多相关文章

  1. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)

    洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...

  2. 18.09.22模拟赛T2 历史

    网上基本上找不到这道题,何况LJJ还稍微改了一下...... 原题:传送门 题目描述 ljj 被S 国数不清的漂亮小姐姐所吸引,为了搞清楚为什么S 国有如此多的漂亮小姐姐,他决定研究S 国的历史. 根 ...

  3. 跳跳虎回家(国庆10.1模拟赛T2)

    题目: [题目描述] 跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家. 跳跳虎所在的世界可以抽象成一个含有 n 个点的图(点编号从 1 到 n ),跳跳虎现在在 1 号点,跳跳虎的家在 n ...

  4. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  5. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  6. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  7. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  8. 2018.10.17NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...

  9. 【2019.10.7 CCF-CSP-2019模拟赛 T2】绝对值(abs)(线段树细节题)

    找规律 设\(p_i=a_{i+1}-a_i\),则答案就是\(\sum_{i=1}^{n-1}p_i\). 考虑若将\(a_i\)加上\(x\)(边界情况特殊考虑),就相当于是将\(p_{i-1}\ ...

  10. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

随机推荐

  1. linux软件管理之python包管理

    Python包管理 ====================================================================================python ...

  2. BaseDao封装

    1.lombok 1) 在pom.xml中导入依赖 <!--导入lombok--> <!-- https://mvnrepository.com/artifact/org.proje ...

  3. linux——文件操作

    1.创建文件夹 mkdir /myFolder 2.创建文件 touch hello.txt 3.复制文件 cp [-adfilprsu] 源文件 目标地址 4.移动 mv 源地址 目标地址 5.正向 ...

  4. Android(五)——dex文件动态调试

    代码动态调试: 代码动态调试技术,一般是通过观察程序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用情况等等,分析函数功能,明确代码逻辑,查找可能存在的漏洞 工具:IDA 条件:Android ...

  5. Apache 如何设置默认首页文档?

    在你安装后的Apache目录下,有一个conf目录,在这个目录里,有一个"httpd.conf"文件.我们要做的,就是修改这个文件. 在这个文件里,凡是以"#" ...

  6. linux添加本地yum源

    增加一块硬盘 然后格式化成btrfs格式的文件 mkfs.btrfs /dev/sde 永久挂载 echo "/dev/sde /mnt btrfs defaults 0 0" & ...

  7. WCF服务无法访问DateTime类型的解决方法

    在WCF服务中,如果entity类含有DateTime类型的字段,那么接口将会被执行两次,从而出现无法访问的情况.如下图所示: 原因是WCF中DateTime无法转换成序列化JSON字符串,DateT ...

  8. promise知识点小结

    断断续续学习es6也有一段时间了,趁着开学空闲对知识点做一些小结. 为什么使用promise 谈到Promise,我们知道,这是社区较理想的异步编程解决方案.想要掌握promise,我们首先要知道其提 ...

  9. Mac下如何配置环境变量JDK

    1.在英文输入法的状态下,按键盘“Ctrl + 空格”组合键,调出Spotlight搜索,在这里可以快速启动终端,输入ter,然后回车,即可打开终端: 2.如果你是第一次配置环境变量,可以使用“tou ...

  10. FormData上传文件(input file)

    <div> <input type="file" name="FileUpload" id="FileUpload" va ...