题目: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. java中的数据加密

    记录 一.java中的数据加密 Java提供的安全模型和API 加密基础知识 使用JAVA实现加密 二.Java提供的安全模型和API 2.1.Java语言本身的安全性 自动内存管理:对于生成的对象在 ...

  2. cat 命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...

  3. #define中的“#”和“##”的作用

    在#define中,标准只定义了#和##两种操作: #用来把参数转换成字符串: ##则用来连接两个前后两个参数,把它们变成一个字符串.

  4. 导入maven项目出现 Unsupported IClasspathEntry kind=4

    Unsupported IClasspathEntry kind=4 这个异常会导致项目无法使用spring ide启动 来自:http://blog.csdn.net/kongqz/article/ ...

  5. C# 关闭显示器(显示)

    1.先引入DllImport所在的名称空间 using System.Runtime.InteropServices; 2.引入方法 [DllImport("user32.dll" ...

  6. 揭开JDBC的神秘面纱,让JDBC数据库的连接参数不再神秘

    1.JDBC是什么? JDBC(Java DataBase Connectivity)java数据库连接 2.JDBC可以做什么?        简单地说,JDBC 可做三件事:与数据库建立连接.发送 ...

  7. iOS利用SDWebImage实现缓存的计算与清理

    概述 可以仅仅清理图片缓存, 也可以清理所有的缓存文件(包括图片.视频.音频等). 详细 代码下载:http://www.demodashi.com/demo/10717.html 一般我们项目中的缓 ...

  8. Google 做过的 12 件奇葩事

    Google做了太多伟大的事情了.以至于有时它有点让人难以实时跟上它的动态.假设你对这家公司略微有点感情.看看他们做过的一些有点匪夷所思的事儿,可能认为,毕竟是大公司.还挺难以被全然理解透的. 一个Q ...

  9. 设置/修改centos上的swap交换分区的方法

    设置centos上的swap交换分区的方法 作为linux世界里最稳定的服务器版本,rhas5一直有很大的应用面,之前一直关注的是freebsd,因为应用的需要,特别在配合mysql和oracle上r ...

  10. 列表生成式&生成器表达式

    一.列表生成式 def func(): return [lambda x:i*x for i in range(4)] print([j(2) for j in func()]) 结果:[6,6,6, ...