题意:

有M个限制,每个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是否有满足的数列。

思路:

看到大牛说是线段树,线段树对于区间操作,印象中乘啊,+啊,-啊都不错,但是并没有就是对于这个位运算就不懂了;

这题的题意就是构造,大致思路是

每条限制是对于每个区间处理就是或上q(可以保证相应的二进制一定是1),然后用线段树处理完m个限制,最后还要询问一下m个限制是否满足;

所以具体操作就是利用线段树进行区间或操作,区间查询且。

PS:

在最后取n个数的时候撒比了,直接取了树上的n个节点位置的数,= =、q[num].x和当left==right的num完全不一样的啊。。哎真踏马蠢了。。

code…

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int N=1e5+10;
struct asd{
int left,right;
int x;
};
asd q[N*4]; struct nod{
int a,b,c;
};
nod temp[N]; void build(int num,int L,int R)
{
q[num].left=L;
q[num].right=R;
if(L==R)
{
q[num].x=0;
return;
}
build(2*num,L,(L+R)/2);
build(2*num+1,(L+R)/2+1,R);
q[num].x=q[2*num].x^q[2*num+1].x;
} void update(int num,int s,int t,int c)
{
if(s<=q[num].left&&t>=q[num].right)
{
q[num].x|=c;
return;
}
int mid=(q[num].left+q[num].right)/2;
if(mid>=t)
update(2*num,s,t,c);
else if(mid<s)
update(2*num+1,s,t,c);
else
{
update(2*num,s,mid,c);
update(2*num+1,mid+1,t,c);
}
}
int query(int num,int s,int t)
{
if(s<=q[num].left&&t>=q[num].right)
return q[num].x;
int mid=(q[num].left+q[num].right)/2;
if(mid>=t)
return query(2*num,s,t);
else if(mid<s)
return query(2*num+1,s,t);
else
{
return query(2*num,s,mid)&query(2*num+1,mid+1,t);
}
} vector<int>ans;
void solve(int num)
{
if(num!=1)
{
q[num].x|=q[num/2].x;
}
if(q[num].left==q[num].right)
{
ans.push_back(q[num].x);
return;
}
solve(2*num);
solve(2*num+1);
} int main()
{
int a,b,c;
int n,m;
scanf("%d%d",&n,&m);
build(1,1,n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
update(1,a,b,c);
temp[i].a=a;
temp[i].b=b;
temp[i].c=c;
}
bool flag=true;
for(int i=1;i<=m;i++)
{
if(query(1,temp[i].a,temp[i].b)!=temp[i].c)
{
flag=false;
break;
}
}
solve(1);
if(flag)
{
puts("YES");
printf("%d",q[1].x);//我直接for一下输出和下面的在vector里面输出为啥顺序不一样。。废话。。踏马这个num是最终子节点么,卧槽。。
for(int i=2;i<=n;i++)
{
printf(" %d",q[i].x);
} printf("%d",ans[0]);
for(int i=1;i<ans.size();i++)
{
printf(" %d",ans[i]);
}
}
else
puts("NO");
return 0;
}

Codeforces482B【线段树构造】的更多相关文章

  1. [IOI2018]机械娃娃——线段树+构造

    题目链接: IOI2018doll 题目大意:有一个起点和$m$个触发器,给出一个长度为$n$的序列$a$,要求从起点出发按$a$的顺序经过触发器并回到起点(一个触发器可能被经过多次也可能不被经过), ...

  2. CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理

    LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ...

  3. codeforces 671C Ultimate Weirdness of an Array 线段树+构造

    题解上说的很清楚了,我照着写的,表示膜拜题解 然后时间复杂度我觉得应该是O(nlogn),虽然常数略大,预处理和倒着扫,都是O(nlogn) #include <stdio.h> #inc ...

  4. 线段树(segment_tree)

    线段树之——区间修改区间查询 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是 ...

  5. HDU1166 敌兵布阵_线段树

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. 线段树(Segment Tree)(转)

    原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...

  7. LightOJ 1097 - Lucky Number 线段树

    http://www.lightoj.com/volume_showproblem.php?problem=1097 题意:一个自然数序列,先去掉所有偶数项,在此基础上的序列的第二项为3,则删去所有3 ...

  8. lintcode:线段树的构造

    线段树的构造 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 ...

  9. BZOJ4345 POI2016Korale(构造+堆+线段树)

    注意到k与n同阶,考虑构造一种枚举子集的方式,使得尽量先枚举较小的子集.首先sort一下,用堆维护待选子集.每次取出最小子集,并加入:1.将子集中最大数ai替换为ai+1 2.直接向子集中添加ai+1 ...

随机推荐

  1. Python学习笔记14:标准库之信号量(signal包)

    signal包负责在Python程序内部处理信号.典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等. 要注意,signal包主要是针对UNIX平台(比方Linux, MAC ...

  2. stretchableImageWithLeftCapWidth

    本文转载至 http://www.cnblogs.com/bandy/archive/2012/04/25/2469369.html (NSInteger)topCapHeight 这个函数是UIIm ...

  3. Go怎么获取当前时间? Go ARM64 vDSO优化之路

    https://mzh.io/ Go ARM64 vDSO优化之路 2018-03-16  | Meng Zhuo 背景 Go怎么获取当前时间?问一个会Go的程序员,他随手就能写这个出来给你. imp ...

  4. C++笔记之外部类访问内部类的私有成员

    如下图所示 内部类可以访问外部类的私有成员 而外部类无法访问内部类的私有成员 为了能让外部类访问内部类的私有成员,将外部类声明为内部类的友元类即可 #include <iostream> ...

  5. spawn类expect方法详解

    本文我们将介绍spawn类的基本方法expect方法,这个方法是用来匹配返回的结果,这个返回的结果是指子程序的返回结果,同时会将匹配的相关信息保存在spawn类的相关属性中. 基本属性包括三个,第一个 ...

  6. js 单例模式的实现方式----闭包和构造函数内部判断

    闭包: var singleton = function( fn ){ var result; return function(){ return result || ( result = fn .a ...

  7. 【Effective C++】设计与声明

    条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. ...

  8. Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)

    var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...

  9. android——实现多语言支持

    我们知道,建好一个android 的项目后,默认的res下面 有layout.values.drawable等目录.这些都是程序默认的资源文件目录,如果要实现多语言版本的话,我们就要添加要实现语言的对 ...

  10. poj2513 Colored Sticks —— 字典树 + 并查集 + 欧拉回路

    题目链接:http://poj.org/problem?id=2513 题解:通过这题了解了字典树.用字典树存储颜色,并给颜色编上序号.这题为典型的欧拉回路问题:将每种颜色当成一个点.首先通过并查集判 ...