码迷,mamicode.com
首页 > 其他好文 > 详细

(线段树)A Corrupt Mayor's Performance Art

时间:2014-10-02 16:25:03      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023

题意: 区间更新, 区间询问;

题解: 区间更新, 区间询问, 一共30种颜色, 可用int 来存。

地区选拔赛的一道题,当时还没怎么学线段树(只会单点更新), 这道题只能看着别人A, 自己干着急。  今天刚看了NOS神牛的第一道区间更新就迫不及待的尝试了下。

不得不说, 题目水, 人更水TT。

最后在感慨一下, NOS神牛的代码真tm好看。

  1 /***Good Luck***/
  2 #define _CRT_SECURE_NO_WARNINGS
  3 #include <iostream>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <string>
  8 #include <algorithm>
  9 #include <stack>
 10 #include <map>
 11 #include <queue>
 12 #include <vector>
 13 #include <set>
 14 #include <functional>
 15 #include <cmath>
 16 #include <numeric>
 17 
 18 #define Zero(a) memset(a, 0, sizeof(a))
 19 #define Neg(a)  memset(a, -1, sizeof(a))
 20 #define All(a) a.begin(), a.end()
 21 #define PB push_back
 22 #define inf 0x3f3f3f3f
 23 #define inf2 0x7fffffffffffffff
 24 #define ll long long
 25 using namespace std;
 26 //#pragma comment(linker, "/STACK:102400000,102400000")
 27 void get_val(int &a) {
 28     int value = 0, s = 1;
 29     char c;
 30     while ((c = getchar()) ==   || c == \n);
 31     if (c == -) s = -s; else value = c - 48;
 32     while ((c = getchar()) >= 0 && c <= 9)
 33         value = value * 10 + c - 48;
 34     a = s * value;
 35 }
 36 #define lson l, m, rt << 1
 37 #define rson m + 1, r, rt << 1| 1
 38 const int maxn = 1e6 + 10;
 39 int A[maxn << 2];
 40 int n, m;
 41 int col[maxn << 2];
 42 void pu(int rt) {
 43     A[rt] = A[rt << 1] | A[rt << 1 | 1];
 44 }
 45 
 46 void pd(int rt) {
 47     if (col[rt]) {
 48         col[rt << 1] = col[rt << 1 | 1] = col[rt];
 49         A[rt << 1] = col[rt];
 50         A[rt << 1 | 1] = col[rt];
 51         col[rt] = 0;
 52     }
 53 }
 54 
 55 void update(int L, int R, int v, int l, int r, int rt) {
 56     if (L <= l && r <= R) {
 57         A[rt] = 1 << (v - 1);
 58         col[rt] = 1 << (v - 1);
 59         return;
 60     }
 61     pd(rt);
 62     int m = (l + r) >> 1;
 63     if (L <= m) update(L, R, v, lson);
 64     if (R > m) update(L, R, v, rson);
 65     pu(rt);
 66 }
 67 
 68 int query(int L, int R, int l, int r, int rt) {
 69     if (L <= l && r <= R) {
 70         return A[rt];
 71     }
 72     pd(rt);
 73     int m = (l + r) >> 1;
 74     int ret = 0;
 75     if (L <= m) ret |= query(L, R, lson);
 76     if (R > m) ret |= query(L, R, rson);
 77     return ret;
 78 }
 79 int main() {
 80     //freopen("data.out", "w", stdout);
 81     //freopen("data.in", "r", stdin);
 82     //cin.sync_with_stdio(false);
 83     while (scanf("%d%d", &n, &m), n|m) {
 84         int t = n << 2;
 85         char q[3];
 86         int a, b, v, ans;
 87         for (int i = 0; i <= t; ++i) {
 88             A[i] = 2;
 89             col[i] = 0;
 90         }
 91         vector<int> vr;
 92         for (int i = 1; i <= m; ++i) {
 93             scanf("%s", q);
 94             if (q[0] == P) {
 95                 scanf("%d%d%d", &a, &b, &v);
 96                 update(a, b,v, 1, n, 1);
 97             } else {
 98                 scanf("%d%d", &a, &b);
 99                 ans = query(a, b, 1, n, 1);
100                 for (int w = 1; w <= 30; ++w) {
101                     if (ans & 1) vr.push_back(w );
102                     ans >>= 1;
103                 }
104                 for (int w = 1; w < vr.size(); ++w) printf("%d ", vr[w - 1]);
105                 printf("%d\n", *vr.rbegin());
106                 vr.clear();
107             }
108         }
109     }
110     return 0;
111 }

 

(线段树)A Corrupt Mayor's Performance Art

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/yeahpeng/p/4004095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!