题目:codeforces 482B. Interesting Array

题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val。

就是区间l---r上的与的值为val,最后问你原来的数组是多少?假设不存在输出no

分析:分析发现要满足全部的区间,而一个点上假如有多个区间的话,这个点的值就是全部区间或的值。由于仅仅有这样才干满足全部区间的。把全部位上的1都保存下来了。那么能够发现用线段树来维护,可是那么怎么推断满不满足条件呢?能够也用线段树,更新了之后在整个维护一遍看看满不满足题意。假设满足的话就能够了。

AC代码:

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 110000;
struct Node
{
int l,r;
int val;
};
Node tree[10*N];
void build(int o,int l,int r)
{
tree[o].l = l,tree[o].r = r;
tree[o].val = 0;
if(l==r)
return ;
int mid = (l+r)/2;
build(o+o,l,mid);
build(o+o+1,mid+1,r);
}
void update(int o,int l,int r,int val)
{
if(tree[o].l==l && tree[o].r==r)
{
tree[o].val|=val;
return ;
}
int mid = (tree[o].l + tree[o].r)/2;
if(mid>=r)
update(o+o,l,r,val);
else if(l>mid)
update(o+o+1,l,r,val);
else
{
update(o+o,l,mid,val);
update(o+o+1,mid+1,r,val);
}
}
int query(int o,int l,int r)
{
if(tree[o].l==l && tree[o].r==r)
return tree[o].val;
int mid = (tree[o].l + tree[o].r)/2;
if(mid>=r)
return query(o+o,l,r);
else if(l>mid)
return query(o+o+1,l,r);
else
{
return query(o+o,l,mid)&query(o+o+1,mid+1,r);
}
}
vector<int> ans;
void solve(int o)
{
if(o!=1)
tree[o].val |= tree[o/2].val;
//printf("%d %d %d %d\n",o,tree[o].l,tree[o].r,tree[o].val);
if(tree[o].l==tree[o].r){
ans.push_back(tree[o].val);
return ;
}
solve(o+o);
solve(o+o+1);
}
Node a[N];
int main()
{
//freopen("Input.txt","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
build(1,1,n);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].val);
update(1,a[i].l,a[i].r,a[i].val);
}
int ok=1;
for(int i=0;i<m;i++)
{
if(query(1,a[i].l,a[i].r)!=a[i].val)
{
ok=0;
break;
}
}
solve(1);
if(ok){
puts("YES");
for(int i=0;i<ans.size();i++)
printf("%d%c",ans[i],i==n?'\n':' ');
ans.clear();
}
else
puts("NO");
return 0;
}

codeforces 482B. Interesting Array【线段树区间更新】的更多相关文章

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

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

  2. CF#52 C Circular RMQ (线段树区间更新)

    Description You are given circular array a0, a1, ..., an - 1. There are two types of operations with ...

  3. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  4. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  5. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  6. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  7. HDU 1698 线段树 区间更新求和

    一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...

  8. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  9. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

随机推荐

  1. oracle 之flashback 深入研究。

    oracle 之flashback 深入研究. 今天是2013-08-24,开始进行oracle flashback 内部原理研究,记录一下笔记. SQL> startup ORACLE ins ...

  2. JAVA 爬虫Gecco

    主要代码: Gecco(matchUrl="https://github.com/{user}/{project}", pipelines="consolePipelin ...

  3. validationEngine 表单验证插件使用

    废话少说,直接上代码,可拷贝直接运行: <!DOCTYPE html> <html lang="zh"> <head> <meta cha ...

  4. 安装 Flex2packagebeta_1.994

    下载文件 解压到/var/root/Media/Cydia/AutoInstall/这个路径重启手机,Cydia会自动安装好DEB文件的 patch路径 下载 /private/var/mobile/ ...

  5. Linux服务器修改时区时间

    时间的一致性很关键,对于日志的分析和程序的对接都至关重要! 01.tzselect 修改时区 可以使用命令 tzselect,修改时区.操作示例: $ tzselect Please identify ...

  6. Dubbo Monitor 配置

    1. Dubbo Monitor 下载dubbo-monitor-simple-2.5.3-assembly.tar.gz 链接:http://pan.baidu.com/s/1gf88wDX 密码: ...

  7. 转载:【微信小程序】 wx:if 与 hidden(隐藏元素)区别

    条件渲染 顾名思义所谓的条件渲染,就是通过条件来判断是否需要渲染该代码块.条件渲染主要是用到wx:if 和 block wx:if 这两个,第一个相信好理解,第二个是在block里面进行条件渲染,这里 ...

  8. 如何使用Dockerfile构建Tomcat镜像并部署war

    我们都知道Docker构建一个镜像有两种方式: 使用`docker commit`命令 使用`Dockerfile`文件和`docker build`命令 那么这两种方式有何区别呢? 相同点:底层实现 ...

  9. jquery添加用户 事例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  10. InteliJ Idea通过maven创建webapp

    facet是IDE给工程添加的属性,在使用maven时一定不能使用facet 一.创建maven项目,选定webapp作为archtype,这样就会自动生成webapp目录 如果没有给maven设置代 ...