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

题目链接

题意:有一个长度 n 的序列,初始染色2,有两种操作,P x ,y ,z,区间x---y染色为z,另一种Q x,y,查询区间 x -- y 有几种颜色,并输出,会覆盖

分析:lz[]为0,表示下面颜色不统一,统一是>0; f[]表示该节点下有多少种颜色,是30种颜色的二进制表示。

刚开始做时,用1<<i 不对,不知道为什么,int的范围按理不会超的。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #define LL __int64
 8 #define lson l, (l+r)/2, 2*rt
 9 #define rson (l+r)/2+1, r, 2*rt+1
10 const int maxn = 1000000+10;
11 using namespace std;
12 int lz[4*maxn], f[4*maxn], x;
13 void pushdown(int rt)
14 {
15     if(lz[rt]!=0)
16     {
17         lz[2*rt] = lz[rt];
18         f[2*rt] = (1<<(lz[rt]-1));
19         lz[2*rt+1] = lz[rt];
20         f[2*rt+1] = (1<<(lz[rt]-1));
21         lz[rt] = 0;
22     }
23 }
24 void pushup(int rt)
25 {
26     f[rt] = (f[2*rt]|f[2*rt+1]);
27 }
28 void update(int ll, int rr, int c, int l, int r, int rt)
29 {
30     if(ll>r) return;
31     if(rr<l) return;
32     if(ll<=l && rr>=r)
33     {
34         lz[rt] = c;
35         f[rt] = (1<<(c-1));
36         return;
37     }
38     pushdown(rt);
39     update(ll, rr, c, lson);
40     update(ll, rr, c, rson);
41     pushup(rt);
42 }
43 void query(int ll, int rr, int l, int r, int rt)
44 {
45     if(ll>r) return;
46     if(rr<l) return;
47     if(ll<=l && rr>=r)
48     {
49         x |= f[rt];
50         return;
51     }
52     pushdown(rt);
53     query(ll, rr, lson);
54     query(ll, rr, rson);
55 }
56 int main()
57 {
58     int n, m, i;
59     int a, b, c, sum;
60     char ch;
61     while(~scanf("%d%d", &n, &m))
62     {
63         if(n==0 && m==0) break;
64         lz[1] = 2; f[1] = 2;   //相当于初始化
65         while(m--)
66         {
67             getchar();
68             scanf("%c", &ch);
69             if(ch==‘P‘)
70             {
71                 scanf("%d%d%d", &a, &b, &c);
72                 update(a, b, c, 1, n, 1);
73             }
74             else
75             {
76                 x = 0;
77                 scanf("%d%d", &a, &b);
78                 query(a, b, 1, n, 1);
79                 sum = 0;
80
81                 for(i = 1; i <= 30; i++)
82                 {
83                     if(x&(1<<(i-1)))
84                     {
85                         if(sum==0)
86                         printf("%d", i);
87                         else
88                         printf(" %d", i);
89                         sum++;
90                     }
91                 }
92                 printf("\n");
93             }
94         }
95     }
96     return 0;
97 }

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

时间: 2024-07-28 12:19:40

hdu 5023 A Corrupt Mayor's Performance Art(线段树)的相关文章

HDU 5023 A Corrupt Mayor&#39;s Performance Art 线段树区间更新+状态压缩

Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5023 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <string> 7 #include <cmath> 8 using namesp

hdu 5023 A Corrupt Mayor&#39;s Performance Art(线段树区间更新)

#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; int tree[5001000],add[5001000]; int color[50]; int n,m; void pushup(int pos) { tree[pos]=tree[pos<<1]|tree[pos<<1|1]; //更新

hdu 5023 A Corrupt Mayor&#39;s Performance Art (线段树)

把求和操作改为或操作,就可以了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 using namespace std; 9 const int ma

hdu 5023 A Corrupt Mayor&#39;s Performance Art (线段树+区间更新+状压)

A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 699    Accepted Submission(s): 267 Problem Description Corrupt governors always find ways to get dirty money.

HDU 5023 A Corrupt Mayor&#39;s Performance Art(线段树区间更新)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色,有两种操作: P a b c  把区间a到b涂成c颜色 Q a b 查询区间a到b的颜色 线段树区间更新,每个节点保存的信息有,存储颜色的c,30种颜色可以压缩到一个int型里面存储,然后还有一个tot,表示这个区间一共有多少种颜色. 对于P操作,依次往下寻找,找要更新的区间,找到要更新的区间之前

HDU 5023 A Corrupt Mayor&#39;s Performance Art (线段树)

A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Submission(s): 255    Accepted Submission(s): 114 Problem Description Corrupt governors always find ways to get dirty money.

ACM学习历程—HDU 5023 A Corrupt Mayor&#39;s Performance Art(广州赛区网赛)(线段树)

Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sell the worthless painting at a high price to someone who wants to bribe him/her on an auction, this seemed a safe way for mayor X to make money. Becaus

2014 网选 广州赛区 hdu 5023 A Corrupt Mayor&#39;s Performance Art

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define N 1000005 6 using namespace std; 7 8 int c[35]; 9 int tree[N*4];//正值表示该节点所管理的区间的颜色是纯色,-1表示的是非纯色 10 int n, m; 11 12 void buildT(int ld, int

HDU - 5023 A Corrupt Mayor&#39;s Performance Art(区间修改)

Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sell the worthless painting at a high price to someone who wants to bribe him/her on an auction, this seemed a safe way for mayor X to make money. Becaus