zoukankan      html  css  js  c++  java
  • Codeforces 482B Interesting Array(线段树区间更新)

    题目链接 Interesting Array

    区间更新。然后对于每一个约数重新求一遍区间的&值,不符合就跳出。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define rep(i, a, b) for (int i(a); i <= (b); ++i)
     6 #define lson i << 1, L, mid
     7 #define rson i << 1 | 1, mid + 1, R
     8 
     9 const int N = 100010;
    10 
    11 struct node{
    12     int l, r, val;
    13 } a[N];
    14 
    15 int tree[N << 2], ans[N];
    16 int n, m;
    17 int ret = 0;
    18 
    19 void update(int i, int L, int R, int l, int r, int val){
    20     if (L == l && R == r){ tree[i] |= val; return ;}
    21     int mid = (L + R) >> 1;
    22     if (r <= mid) update(lson, l, r, val);
    23     else if (l > mid) update(rson, l, r, val);
    24     else{
    25     update(lson, l, mid, val);
    26     update(rson, mid + 1, r, val);
    27     }
    28 }
    29 
    30 int query(int i, int L, int R, int l, int r){
    31     if (L == l && R == r) return tree[i];
    32     int mid = (L + R) >> 1;
    33     if (r <= mid) return query(lson, l, r);
    34     else if (l > mid) return query(rson, l, r);
    35     else return query(lson, l, mid) & query(rson, mid + 1, r);
    36 }
    37 
    38 void Work(int i, int L, int R){
    39     tree[i] |= tree[i >> 1];
    40     if (L == R){ ans[++ret] = tree[i]; return ;}
    41     int mid = (L + R) >> 1;
    42     Work(lson);
    43     Work(rson);
    44 }
    45     
    46 
    47 int main(){
    48 
    49     scanf("%d%d", &n, &m);
    50     
    51 
    52     memset(tree, 0, sizeof tree);
    53     rep(i, 1, m){
    54     scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].val);
    55     update(1, 1, n, a[i].l, a[i].r, a[i].val);
    56     }
    57 
    58     bool flag = true;
    59 
    60     rep(i, 1, m){
    61     int cnt = query(1, 1, n, a[i].l, a[i].r);
    62     if (cnt != a[i].val){
    63         flag = false;
    64         break;
    65     }
    66     }
    67 
    68     if (flag) Work(1, 1, n); else return 0 * puts("NO");
    69     puts("YES"); rep(i, 1, ret) printf("%d ", ans[i]);
    70     
    71 
    72     return 0;
    73 }
  • 相关阅读:
    PHP框架 CI与TP之MVC比较
    多线程设计要点
    BigPipe 的工作原理
    Linux yum命令的使用技巧
    java 乱码问题
    win7或xp下常用命令
    不同场景下JVM参数的设置
    win7笔记本创建wifi热点
    maven编译出现Java heap space
    Curling 2.0——蛋疼的一道题
  • 原文地址:https://www.cnblogs.com/cxhscst2/p/6675233.html
Copyright © 2011-2022 走看看