HDU 5023 A Corrupt Mayor'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操作,依次往下寻找,找要更新的区间,找到要更新的区间之前,如果当前所在的区间的总共的颜色只有一种,那么就要把这个区间的信息压到这个节点的两个子节点中,

然后再选择要更新的那个区间所在的那个区间继续往下更新。

对于Q操作,这个可以随便了,反正区间的信息都存在了每个节点的C 里面,只要按规则取出来就行了。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 using namespace std;
  6 const int maxn = 1000005;
  7 struct node
  8 {
  9     int l,r,c,tot;
 10     void Node(int l1,int r1,int c1,int tot1)
 11     {
 12         l = l1,r = r1,c = c1,tot = tot1;
 13     }
 14 }tree[4*maxn];
 15 int ans;
 16
 17 void Init(int p)
 18 {
 19     if(tree[p].l == tree[p].r) return ;
 20     int mid = (tree[p].l + tree[p].r) / 2;
 21     tree[2*p].Node(tree[p].l,mid,2,1);
 22     tree[2*p+1].Node(mid+1,tree[p].r,2,1);
 23     Init(2*p);
 24     Init(2*p+1);
 25 }
 26 void paint(int p,int l,int r,int c)
 27 {
 28     if(tree[p].l == l && tree[p].r == r)
 29     {
 30         tree[p].c = 1 << (c-1);
 31         tree[p].tot = 1;
 32         return ;
 33     }
 34     int mid = (tree[p].l + tree[p].r) / 2;
 35     int T;
 36     if(tree[p].tot == 1)   //如果这个节点只有一种颜色,需要先往下推
 37     {
 38         T = 0;
 39         for(int i = 0;i < 30;++i)
 40         if(tree[p].c & (1 << i))
 41         {
 42             T = i+1;
 43             break;
 44         }
 45         paint(2*p,tree[p].l,mid,T);
 46         paint(2*p+1,mid+1,tree[p].r,T);
 47     }
 48     if(r <= mid)
 49     {
 50         paint(2*p,l,r,c);
 51     }
 52     if(l <= mid && r > mid)
 53     {
 54         paint(2*p,l,mid,c);
 55         paint(2*p+1,mid+1,r,c);
 56     }
 57     else if(l > mid)
 58     {
 59         paint(2*p+1,l,r,c);
 60     }
 61     tree[p].c = tree[2*p].c | tree[2*p+1].c;   //回溯
 62     int tt = 0;
 63     for(int i = 0;i < 30;++i)
 64     if(tree[p].c & (1 << i))
 65     tt++;
 66     tree[p].tot = tt;
 67 }
 68 void query(int p,int l,int r)
 69 {
 70     if((tree[p].l == l && tree[p].r == r) || tree[p].tot == 1)
 71     {
 72         ans |= tree[p].c;
 73         return ;
 74     }
 75     int mid = (tree[p].l + tree[p].r) / 2;
 76     if(r <= mid) query(2*p,l,r);
 77     else if(l <= mid && r > mid)
 78     {
 79         query(2*p,l,mid);
 80         query(2*p+1,mid+1,r);
 81     }
 82     else if(l > mid) query(2*p+1,l,r);
 83 }
 84 int main()
 85 {
 86 //    freopen("in.txt","r",stdin);
 87 //    freopen("out.txt","w",stdout);
 88     int n,m;
 89     while(scanf("%d%d",&n,&m),n+m)
 90     {
 91         tree[1].Node(1,n,2,1);
 92         Init(1);
 93         int a,b,c;
 94         char oper[5];
 95         while(m--)
 96         {
 97             scanf("%s%d%d",oper,&a,&b);
 98             if(oper[0] == ‘P‘)
 99             {
100                 scanf("%d",&c);
101                 paint(1,a,b,c);
102             }
103             else
104             {
105                 ans = 0;
106                 query(1,a,b);
107                 int flag = 1;
108                 for(int i = 0;i < 30;++i)
109                 if(ans & (1 << i))
110                 {
111                     printf(flag? "%d":" %d",i+1);
112                     flag = 0;
113                 }
114                 puts("");
115             }
116         //    for(int i = 1;i <= 9;++i)
117         //    printf(i == 9? "%d\n":"%d ",tree[i].c);
118         //    for(int i = 1;i <= 9;++i)
119         //    printf(i == 9? "%d\n":"%d ",tree[i].tot);
120         }
121     }
122 }

HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

时间: 2024-08-27 21:22:19

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 (线段树+区间更新+状压)

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 (线段树)

把求和操作改为或操作,就可以了. 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(线段树)

题目链接 题意:有一个长度 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 #includ

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): 33    Accepted Submission(s): 11 Problem Description Corrupt governors always find ways to get dirty money. Pa

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