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  判断 查询的颜色 是否在这里面。。。。。

  1 #include<cstdio>
  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 )相关推荐

  1. HDU 4391 Paint The Wall 段树(水

    意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...

  2. HDU 4262 Juggler (模拟+线段树优化)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove http://acm.hdu.e ...

  3. hdu 4521(线段树优化dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Pro ...

  4. CF786B Legacy(线段树优化建边模板 + 最短路)

    整理的算法模板合集: ACM模板 目录 线段树优化建边 题目传送门 由于本题的数据达到了1e5,所以如果直接全部暴力连边的话会达到O(n2)O(n^2)O(n2),时间包括内存都受不了.因此我们需要使 ...

  5. P1047 校门外的树(线段树优化)(校门三部曲)难度⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  6. string [线段树优化桶排]

    题意大概是给你一个字符串,1e5次修改,每次给一个区间升序排列或降序排列,最后输出这个字符串; 其实是个挺裸的线段树优化题;但是我没有意识去结合桶排,扑该..... 首先 1.40分算法 O(NMlo ...

  7. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  8. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  9. hdu5489 Removed Interval dp+线段树优化

    现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...

最新文章

  1. php看什么教程,PHP初学者适合看什么
  2. shell,自动挂载磁盘
  3. boost::phoenix::function相关的测试程序
  4. lol转服务器维护,LOL转区系统活动_LOL转区系统活动地址_玩游戏网
  5. 怎么把打开方式改回计算机程序,电脑打开方式改变了,怎么还原
  6. 我的世界rpg服务器背包位置,我的世界:如何识别MC老玩家?看他背包中有没有这五种道具...
  7. sql中的distinct
  8. C语言 谭浩强第五版 课后习题解答
  9. Visio2010正确的安装步骤
  10. 电子商务网站建设规划方案
  11. 计算机策略组无法打开怎么办,本地组策略打不开,怎么解决
  12. MATLAB中fspecial()函数的用法
  13. 五、鼎捷T100总账管理之总账报表及查询
  14. 简报 | 解决“无感停车”开票难题, 广州试水区块链停车发票
  15. 微信小程序:实现微信登录
  16. 纯音乐 Heaven Earth
  17. 人们说程序员很高大上,程序员是做编程的,编程又是做什么呢?
  18. RK平台 USB转RS485
  19. SAP 薪酬计算流程
  20. NBS BioCommand PLUS

热门文章

  1. springboot定时任务
  2. Spring底层控制反转解耦合(IOC)
  3. echarts --- 多折线图按段显示颜色规则订制
  4. es6 --- promise和async/await的区别
  5. 阿里云RPA专有云产品文档集合
  6. kindeditor用法简单介绍(转)
  7. MySQL5.6主从复制搭建基于日志(binlog)
  8. AIX-vi操作-提示Unknown terminal type的问题解决方法
  9. C#委托的异步调用[转]
  10. 摩托罗拉:未来一切以手机为中心