hdu 4391 Paint The Wall 线段树 +优化 2012 Multi-University Training Contest 10 )
http://acm.hdu.edu.cn/showproblem.php?pid=4391
题意:
刷墙, 以开始 有 n个节点,每个节点有一种颜色 ,m 次询问
m次 输入 a,l,r,z 如果 a=1 将 l到 r 刷为 z 颜色,如果 a=2 询问 l 到 r 有 多少个 和 z 相同的 节点
官方题解是: 分段哈希,自己一开始想写 一下 ,单写着写着 就 觉得很麻烦 ,各中判断条件。。。。。
后来改为 线段树 优化了下 ,就是加了 个 mi mx 判断 查询的颜色 是否在这里面。。。。。
2 #include<cstring>
3 #include<cmath>
4 #include<iostream>
5 #include<algorithm>
6 #include<set>
7 #include<map>
8 #include<queue>
9 #include<vector>
10 #include<string>
11 #define Min(a,b) a<b?a:b
12 #define Max(a,b) a>b?a:b
13 #define CL(a,num) memset(a,num,sizeof(a));
14 #define maxn 100010
15 #define eps 1e-6
16 #define inf 9999999
17 #define ll __int64
18 using namespace std;
19 struct node
20 {
21 int l;
22 int r;
23 int c;
24 int mi;
25 int mx;
26 }p[maxn*4];
27 int a[maxn] ;
28 void build(int x,int l,int r)
29 {
30 if(l == r)
31 {
32 p[x].l = l;
33 p[x].r = r;
34 p[x].c= a[l];
35 p[x].mi = a[l];
36 p[x].mx = a[l];
37 return ;
38 }
39 int mid = (l+r)>>1;
40 p[x].l = l;
41 p[x].r = r;
42 build(x*2,l,mid);
43 build(x*2+1,mid+1,r);
44 if(p[x*2].c == p[x*2+1].c &&p[x*2].c != -1)p[x].c = p[x*2].c;
45 else p[x].c = -1;
46
47 p[x].mi = min(p[x*2].mi,p[x*2+1].mi);
48 p[x].mx = max(p[x*2].mx,p[x*2+1].mx);
49
50
51
52 }
53 void change(int x,int l,int r,int z)
54 {
55 if(z == p[x].c) return;
56 if(l == p[x].l&&r == p[x].r)
57 {
58 p[x].c = z ;
59 p[x].mi = z;
60 p[x].mx = z;
61
62 return ;
63
64 }
65 int mid = (p[x].l+p[x].r)>>1;
66 if(p[x].c != -1)
67 {
68 p[x*2].c = p[x].c;
69 p[x*2+1].c = p[x].c;
70 p[x*2].mi =p[x*2+1].mi = p[x].mi;//这两个忘了 下分了 错了 一次。。。。。。。。
71 p[x*2].mx=p[x*2+1].mx = p[x].mx;
72 p[x].c = -1;
73 }
74
75 if(r<=mid) change(x*2,l,r,z);
76 else
77 {
78 if(l>mid)change(x*2+1,l,r,z);
79 else
80 {
81 change(x*2,l,mid,z);
82 change(x*2+1,mid+1,r,z);
83 }
84 }
85 p[x].mi = min(p[x*2].mi,p[x*2+1].mi);
86 p[x].mx = max(p[x*2].mx,p[x*2+1].mx);
87 }
88 int get(int x,int l,int r,int z)
89 {
90 if(p[x].c!=-1 &&p[x].c!=z)return 0;
91 if(z<p[x].mi ||z>p[x].mx) return 0;
92
93 if(p[x].l <= l&&p[x].r >= r&&p[x].c == z)
94 {
95 return r - l + 1;
96 }
97 int mid = (p[x].l + p[x].r)>>1;
98
99 if(r<=mid) return get(x*2,l,r,z);
100 else
101 {
102 if(l>mid) return get(x*2+1,l,r,z);
103 else
104 {
105 int t1 = get(x*2,l,mid,z);
106 int t2 = get(x*2+1,mid+1,r,z);
107 return t1+t2;
108 }
109 }
110
111
112
113 }
114
115 int main()
116 {
117 int n,m,d,l,r,z,i;
118 //freopen("data.in","r",stdin);
119 while(scanf("%d%d",&n,&m)!=EOF)
120 {
121 for(i = 0; i < n;i++)
122 {
123 scanf("%d",&a[i]);
124 }
125 build(1,0,n - 1);
126 while(m--)
127 {
128 scanf("%d%d%d%d",&d,&l,&r,&z);
129 if(d == 1)
130 {
131 change(1,l,r,z);
132 }
133 else
134 {
135 int ans = get(1,l,r,z);
136 printf("%d\n",ans);
137 }
138 }
139 }
140 }
转载于:https://www.cnblogs.com/acSzz/archive/2012/08/24/2654564.html
hdu 4391 Paint The Wall 线段树 +优化 2012 Multi-University Training Contest 10 )相关推荐
- HDU 4391 Paint The Wall 段树(水
意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...
- HDU 4262 Juggler (模拟+线段树优化)
转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove http://acm.hdu.e ...
- hdu 4521(线段树优化dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Pro ...
- CF786B Legacy(线段树优化建边模板 + 最短路)
整理的算法模板合集: ACM模板 目录 线段树优化建边 题目传送门 由于本题的数据达到了1e5,所以如果直接全部暴力连边的话会达到O(n2)O(n^2)O(n2),时间包括内存都受不了.因此我们需要使 ...
- P1047 校门外的树(线段树优化)(校门三部曲)难度⭐⭐
校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...
- string [线段树优化桶排]
题意大概是给你一个字符串,1e5次修改,每次给一个区间升序排列或降序排列,最后输出这个字符串; 其实是个挺裸的线段树优化题;但是我没有意识去结合桶排,扑该..... 首先 1.40分算法 O(NMlo ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]
UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...
- hdu5489 Removed Interval dp+线段树优化
现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...
最新文章
- php看什么教程,PHP初学者适合看什么
- shell,自动挂载磁盘
- boost::phoenix::function相关的测试程序
- lol转服务器维护,LOL转区系统活动_LOL转区系统活动地址_玩游戏网
- 怎么把打开方式改回计算机程序,电脑打开方式改变了,怎么还原
- 我的世界rpg服务器背包位置,我的世界:如何识别MC老玩家?看他背包中有没有这五种道具...
- sql中的distinct
- C语言 谭浩强第五版 课后习题解答
- Visio2010正确的安装步骤
- 电子商务网站建设规划方案
- 计算机策略组无法打开怎么办,本地组策略打不开,怎么解决
- MATLAB中fspecial()函数的用法
- 五、鼎捷T100总账管理之总账报表及查询
- 简报 | 解决“无感停车”开票难题, 广州试水区块链停车发票
- 微信小程序:实现微信登录
- 纯音乐 Heaven Earth
- 人们说程序员很高大上,程序员是做编程的,编程又是做什么呢?
- RK平台 USB转RS485
- SAP 薪酬计算流程
- NBS BioCommand PLUS