Codeforces Round #275 (Div. 1)B(線段樹+位運算)

B. 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 the m constraints consists of three integers liriqi (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 nm (1 ≤ n ≤ 1051 ≤ m ≤ 105) — the number of elements in the array and the number of limits.

Each of the next m lines contains three integers liriqi (1 ≤ li ≤ ri ≤ n0 ≤ 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 integers a[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.

Sample test(s)
input
3 1
1 3 3
output
YES
3 3 3
input
3 2
1 3 3
1 3 2
output
NO

題意:給出很多個區間,使得每個區間的值相與爲qi,要求構造出n個數使得每個區間都滿足

思路:比如第i個區間,如果裏面所有的數相與要爲qi,那麼將這些數寫成二進制以後qi爲1的位要全爲1,剩下的位至少有一個要爲0

            那麼我可以初始化n個數爲0,先把所有位必須爲1的構造出來,對於m個區間可以用線段樹完成,只做懶操作,區間的值相或(先不向上更新)

            然後再從1到n掃一遍線段樹,把每個位置的數都更新到位,然後再次對於m個區間,現在只做向上更新(區間的值相與),然後只要所有區間的值都等於qi就能夠成功構

            造出來

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define lson l,m,o<<1
#define rson m+1,r,o<<1|1

const int MAXN = 100005;
const int INF = ~0U>>1;

int is[MAXN<<2];
int laz[MAXN<<2];

void build()
{
    memset(is,0,sizeof(is));
    memset(laz,0,sizeof(laz));
}

void pushdown(int o)
{
    if(laz[o]){
        laz[o<<1]|=laz[o];
        laz[o<<1|1]|=laz[o];
        is[o<<1]|=laz[o];
        is[o<<1|1]|=laz[o];
        laz[o]=0;
    }
}

void update(int l,int r,int o,int L,int R,int q)
{
    if(L<=l&&r<=R){
        is[o]|=q;
        laz[o]|=q;
        return;
    }
    int m=l+r>>1;
    pushdown(o);
    if(L<=m)update(lson,L,R,q);
    if(m>1;
    pushdown(o);
    repair(lson);
    repair(rson);
    pushup(o);
}

int query(int l,int r,int o,int L,int R)
{
    if(L<=l&&r<=R){
        return is[o];
    }
    int m=l+r>>1;
    int res=INF;
    if(L<=m)res=res&query(lson,L,R);
    if(m>1;
    pushdown(o);
    print(lson);
    print(rson);
}

int l[MAXN],r[MAXN],q[MAXN];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    build();
    for(int i=0;i
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章