题面


【题目描述】
你需要构造一个长度为 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. .net core创建控制台应用程序和mvc程序

    一.创建控制台应用程序 1.查看支持哪些类型:dotnet new --help 2.创建项目(先定位到需要创建的目录) dotnet new console -o ./myconsole 3.查看目 ...

  2. cookie 和session 详解

    cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于c ...

  3. C#数组--(一维数组,二维数组的声明,使用及遍历)

    数组:是具有相同数据类型的一组数据的集合.数组的每一个的变量称为数组的元素,数组能够容纳元素的数称为数组的长度. 一维数组:以线性方式存储固定数目的数组元素,它只需要1个索引值即可标识任意1个数组元素 ...

  4. 合并多个Excel

    合并excel分为两种情况:1.将多个excel文件合并在一个excel中的不同sheet中.2.将多个excel文件合并在一个excel文件的一个sheet中. 1.将多个excel的文件合并在一个 ...

  5. zabbix3.4.7实操总结一

    一.zabbix_server的配置说明 #需要修改的内容为如下:[root@localhost ~]# cd /usr/local/zabbix/etc/[root@localhost etc]# ...

  6. 上海MVP见面会

    很愉快,很有收获的一次见面!

  7. 路由导航之第一个子模块(HomeModule)

    git clone git@github.com:len007/my-angular2-app.git my-angular2-app 开始 一个URL = 一个页面 = 一个Component. 我 ...

  8. 微信内嵌浏览器打开手机浏览器下载APP(APK)的方法

    想必大家会经常碰到网页链接在微信内无法打开和微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要有以下四点 1.网页链接被举报次数 ...

  9. flask基础--第二篇

    1.Flask中的HTTPResponse,Redirect, render #导入render_template和redirect from flask import Flask,render_te ...

  10. 8款非常不错的.Net反编译利器

    本人搜集了下8款非常不错的.Net反编译利器: 1.Reflector Reflector是最为流行的.Net反编译工具.Reflector是由微软员工Lutz Roeder编写的免费程序.Refle ...