题目描述:

D. Interesting Array
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

We'll call an array of n non-negative integers a[1], a[2], ..., a[n] interesting, if it meets m constraints. The i-th of them constraints consists of three integers li, ri, qi (1 ≤ li ≤ ri ≤ n) meaning that value  should be equal to qi.

Your task is to find any interesting array of n elements or state that such array doesn't exist.

Expression x&y means the bitwise AND of numbers x and y. In programming languages C++, Java and Python this operation is represented as "&", in Pascal — as "and".
Input

The first line contains two integers n, m (1 ≤ n ≤ 105, 1 ≤ m ≤ 105) — the number of elements in the array and the number of limits.

Each of the next m lines contains three integers li, ri, qi (1 ≤ li ≤ ri ≤ n, 0 ≤ qi < 230) describing the i-th limit.
Output

If the interesting array exists, in the first line print "YES" (without the quotes) and in the second line print n integersa[1], a[2], ..., a[n] (0 ≤ a[i] < 230) decribing the interesting array. If there are multiple answers, print any of them.

If the interesting array doesn't exist, print "NO" (without the quotes) in the single line.
Examples
input

3 1
1 3 3

output

YES
3 3 3

input

3 2
1 3 3
1 3 2

output

NO

思路:

跟区间相关的问题可以考虑用线段树。这道题是要通过一次次的限制,把数组中的数构造出来。比如第l个到第r个数的&结果为q,即在二进制表示上,如果某一位并的结果为一,那么该区间上所有数的该位全都为一,若某一位结果为零,那么该区间上至少有一个数的该位为0。

刚开始:全为一时知道区间上所有数在这一位上为一,并为零时不知道区间上那一个数的这一位为零。想构造二维向量,将数组中的数用二进制表示,暴力解出可能的结果。但好像操作起来挺复杂(编程实现有点困难,对我这个蒟蒻来说),也可能会超时。

最后:考虑线段树,来结合问题看一看。在区间【l,r】上,假设并的结果为3(样例1),那么区间上的每一个数(用sum数组来实现线段树)为线段树的叶节点,刚开始sum[i]=0,在一次次的限制条件下,用sum[k]|=q[i],(q[i]表示并的结果),即用或操作我们可以构造出sum[k]来满足一条条的限制条件,当所有的限制条件过完了后,在来查询一个个限制条件所给的区间上数的并是否依然等于q[i],因为在刚刚构造过程中前面满足的条件可能会因为后面的限制条件而改变,改变就说明出现了两个矛盾的限制条件,因为对不矛盾的限制条件来说,他们构造的数应是要么相等,要么构造的数不一是同一个。

在求区间和的线段树模板上稍作改动。具体的,把

pushup(k){sum[k] = sum[k<<1]+sum[k<<1|1]的加改为并,在询问操作中的返回结果思考了有点久,这跟和好像不太一样,注意题目中的数据范围(小于2^30),就用I=2^30-1,代替ans += ···为I &=···来返回结果。

小心的是pushdown的时刻,返回时怎么返回结果,还有一点:2<<30-1你以为是2^30-1?错了!注意运算符的优先级,写成(2<<30)-1

知识点:线段树

代码:

 #include <iostream>
#define max_n 100005
using namespace std;
int sum[max_n<<];
int lz[max_n<<];
int l[max_n];
int r[max_n];
int q[max_n];
int n;
int m;
int I;
void pushup(int k)
{
sum[k] = sum[k<<]&sum[k<<|];
}
void pushdown(int k,int ln,int rn)
{
if(lz[k])
{
sum[k<<] |= lz[k];
sum[k<<|] |= lz[k];
lz[k<<] |= lz[k];
lz[k<<|] |= lz[k];
lz[k] = ;
}
}
void build(int k,int l,int r)
{
lz[k] = ;
if(l==r)
{
sum[k]=;
return;
}
int mid = (l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
pushup(k);
}
void update(int k,int L,int R,int l,int r,int val)
{
if(L<=l&&r<=R)
{
sum[k] |= val;
lz[k] |= val;
return;
}
int mid = (l+r)/;
int ln = mid-l+;
int rn = r-mid;
pushdown(k,ln,rn);
if(L<=mid) update(k<<,L,R,l,mid,val);
if(mid<R) update(k<<|,L,R,mid+,r,val);
pushup(k);
}
int query(int k,int L,int R,int l,int r)
{
if(L<=l&&r<=R)
{
//cout << "k " << k << " " << sum[k] << endl;
return sum[k];
}
int mid = (l+r)>>;
int ln = mid-l+;
int rn = r-mid;
pushdown(k,ln,rn);
long long I = (long long)(<<) - ;
if(L<=mid) I = I&query(k<<,L,R,l,mid);
//cout << "qian " << I << endl;
if(mid<R) I = I&query(k<<|,L,R,mid+,r);
pushup(k);
//cout << "hou " << I << endl;
return I;
}
int main()
{
cin >> n >> m;
build(,,n);
for(int i = ;i<m;i++)
{
cin >> l[i] >> r[i] >> q[i];
update(,l[i],r[i],,n,q[i]);
}
for(int i = ;i<m;i++)
{
int ans = query(,l[i],r[i],,n);
if(ans!=q[i])
{
cout << "NO" << endl;
return ;
}
}
cout << "YES" << endl;
for(int i = ;i<=n;i++)
{
cout << query(,i,i,,n) << " ";
}
return ;
}

Codeforces E. Interesting Array(线段树)的更多相关文章

  1. Codeforces 482B Interesting Array(线段树)

    题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...

  2. Codeforces Round #275 Div.1 B Interesting Array --线段树

    题意: 构造一个序列,满足m个形如:[l,r,c] 的条件. [l,r,c]表示[l,r]中的元素按位与(&)的和为c. 解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的 ...

  3. codeforces 482B. Interesting Array【线段树区间更新】

    题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...

  4. [Codeforces 266E]More Queries to Array...(线段树+二项式定理)

    [Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...

  5. Buses and People CodeForces 160E 三维偏序+线段树

    Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...

  6. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  7. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  8. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  9. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

随机推荐

  1. typescript导入图片报找不到模块的错误

    https://www.cnblogs.com/chen-cong/p/10445635.html images.d.ts: declare module '*.svg' declare module ...

  2. scala 特质的应用

    一.为类提供可以堆叠的改变 package com.jason.qianfeng trait Loggertest { def logger(msg: String) } trait ConsoleL ...

  3. 世界视频编码器大赛结果揭晓,腾讯V265编码器勇夺两项第一

    2019年10月22日,由莫斯科国立大学(Moscow State University)举办的MSU世界视频编码器大赛成绩揭晓, 腾讯内部开源协同的V265编码器再创佳绩,一举拿下PSNR(峰值信噪 ...

  4. 解决GitHub下载慢或下载失败问题

    1.登录自己的码云账户 码云网站:https://gitee.com/luckyplj8/events 2.新建一个仓库. 3.选择导入已有仓库. GitHub资源链接: 4.等待码云克隆项目,大概1 ...

  5. JVM Server与Client运行模式

    JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是: 当虚拟机运行在-client模式的时候,使用的 ...

  6. MyBatis参数条件查询传入的值为0时的判断

    MyBatis条件查询对字段判断是否为空一般为: <if test="testValue!=null and testValue != ''"> and test_va ...

  7. STM32 EV1527无线通信(433)

    EV1527无线通信 先说一下这个通信协议的数据格式,这个图片是我在手册里截的. 大家按照单片机类型计算周期,我的是STM32f103vb (4CLK大致等于350um) 发送时按照 先发同步码后发D ...

  8. PHP 输入输出流 php://input 获取表单中2个重名name的值

    PHP 输入输出流 php://input   获取表单中2个重名name的值 <?php // PHP有一种"所有IO都是流"的说法. // 压缩流参考 https://w ...

  9. 阿里云主机centos7系统创建SWAP区,并启动挂载(适合无SWAP区虚拟化平台)

    以root用户登录建立交换区文件: fallocate -l 2G /swapfile /swapfile //赋予仅root用户的权限,确保安全 mkswap /swapfile swapon /s ...

  10. Java之数据类型讲解

    Java数据类型关系图 基本数据类型 从小到大的关系图: 图中从左向右的转换都是隐式转换,无需再代码中进行强制转换 : byte i = 12; System.out.println("by ...