题意:

给出n个节点,编号0~n-1。

1 把[x,y]颜色覆盖为z。

2 询问[x,y]颜色为z的有多少个。

题解:http://page.renren.com/601081183/note/867254911

懒得hash,直接用map搞。

把数列分成sqrt(n)段,如果每段在完整的查询区间内,可以O(1)得到答案,否则对该段暴力答案。

  1 #include<cstdio>
  2 #include<cmath>
  3 #include<map>
  4 #define EPS 1e-8
  5 #define MAXM 331
  6 #define MAXN 100010
  7 using namespace std;
  8 int col[MAXN], same[MAXM];
  9 map<int, int> mymap[MAXM];
 10 int n, block;
 11 void Hash(int t) {
 12     int nd, i;
 13     mymap[t].clear();
 14     nd = min(t * block + block, n);
 15     for (i = t * block; i < nd; i++)
 16         mymap[t][col[i]]++;
 17 }
 18 void PushDown(int t) {
 19     int i, nd;
 20     nd = min(t * block + block, n);
 21     if (same[t] >= 0) {
 22         for (i = t * block; i < nd; i++)
 23             col[i] = same[t];
 24         same[t] = -1;
 25     }
 26 }
 27 void Update(int x, int y, int z) {
 28     int t, i, nd;
 29     t = x / block;
 30     if (t == y / block) {
 31         if (same[t] != z) {
 32             PushDown(t);
 33             for (i = x; i <= y; i++)
 34                 col[i] = z;
 35             Hash(t);
 36         }
 37     } else {
 38         if (x % block) {
 39             if (same[t] != z) {
 40                 PushDown(t);
 41                 for (nd = min(t * block + block, n); x < nd; x++)
 42                     col[x] = z;
 43                 Hash(t);
 44             } else
 45                 x = min(t * block + block, n);
 46         }
 47         if (y % block != block - 1) {
 48             t = y / block;
 49             if (same[t] != z) {
 50                 PushDown(t);
 51                 for (nd = t * block; y >= nd; y--)
 52                     col[y] = z;
 53                 Hash(t);
 54             } else
 55                 y = t * block - 1;
 56         }
 57         for (t = x / block; x <= y; x += block, t++)
 58             same[t] = z;
 59     }
 60 }
 61 int Query(int x, int y, int z) {
 62     int t, i, nd, ans;
 63     t = x / block;
 64     ans = 0;
 65     if (t == y / block) {
 66         if (same[t] == z)
 67             ans += y - x + 1;
 68         else if (same[t] == -1) {
 69             for (i = x; i <= y; i++) {
 70                 if (col[i] == z)
 71                     ans++;
 72             }
 73         }
 74     } else {
 75         if (x % block) {
 76             if (same[t] == z) {
 77                 ans += block - x % block;
 78                 x = min(t * block + block, n);
 79             } else if (same[t] == -1) {
 80                 for (nd = min(t * block + block, n); x < nd; x++) {
 81                     if (col[x] == z)
 82                         ans++;
 83                 }
 84             } else
 85                 x = min(t * block + block, n);
 86         }
 87         if (y % block != block - 1) {
 88             t = y / block;
 89             if (same[t] == z) {
 90                 ans += y % block + 1;
 91                 y = t * block - 1;
 92             } else if (same[t] == -1) {
 93                 for (nd = t * block; y >= nd; y--) {
 94                     if (col[y] == z)
 95                         ans++;
 96                 }
 97             } else
 98                 y = t * block - 1;
 99         }
100         for (t = x / block; x <= y; x += block, t++) {
101             if (same[t] >= 0) {
102                 if (same[t] == z)
103                     ans += block;
104             } else {
105                 if (mymap[t].count(z))
106                     ans += mymap[t][z];
107             }
108         }
109     }
110     return ans;
111 }
112 int main() {
113     int q, i, j, cmd, x, y, z;
114     while (~scanf("%d%d", &n, &q)) {
115         block = (int) (ceil(sqrt((double) n)) + EPS);
116         for (i = 0; i < n; i++)
117             scanf("%d", &col[i]);
118         for (i = j = 0; i < n; i += block, j++) {
119             same[j] = -1;
120             Hash(j);
121         }
122         while (q--) {
123             scanf("%d%d%d%d", &cmd, &x, &y, &z);
124             if (cmd == 1)
125                 Update(x, y, z);
126             else
127                 printf("%d\n", Query(x, y, z));
128         }
129     }
130     return 0;
131 }

转载于:https://www.cnblogs.com/DrunBee/archive/2012/08/27/2658870.html

【HDU】4391 Paint The Wall相关推荐

  1. 【HDU】3441 Rotation

    题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围.用C ...

  2. 【HDU】1695 GCD

    题意:x在[a,b]内,y在[c,d]内,求GCD(x,y)=k的个数,题目保证a=c=1. 由于GCD(x,y)=k,则GCD(x/k,y/k)=1. 那么只要求x在[1,b/k]内,y在[1,d/ ...

  3. 【HDU】4942 Game on S♂play 线段树

    传送门:[HDU]4942 Game on S♂play 题目分析:今天下午被这道题整死了,因为我的写法导致有的数可能变成负的,但是我们有察觉到,debug了一下午还是在吃饭的时候突然想到这个问题的. ...

  4. 【HDU】5238 Calculator 【中国剩余定理+线段树】

    传送门:[HDU]5238 Calculator 题目分析: 模数可以拆成四个小素数:7,13,17,19. 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好.中间我们用线段树,保存每个 ...

  5. 【HDU】5197 DZY Loves Orzing 【FFT启发式合并】

    传送门:[HDU]5197 DZY Loves Orzing 题目分析: 首先申明,我不会dpdp方程= =--这个东西给队友找出来了,然后我就是套这个方程做题的Qrz-- 对于这题,因为n2n^2个 ...

  6. 【HDU】1535 Invitation Cards 最短路

    传送门:[HDU]1535 Invitation Cards 题目分析:题目真难读......其实题目的意思就是让求从编号为1的点到其他所有点的最短路距离之和加上其他所有点到编号为1的点的最短路距离之 ...

  7. 【HDU】4411 Arrest 费用流

    传送门:[HDU]4411 Arrest 题目分析:题目的意思一开始没看懂= =...题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的).且 ...

  8. 【HDU】3271 SNIBB 数位DP

    传送门:[HDU]3271 SNIBB 题目分析:第一问直接求,第二问就二分.水题. 代码如下: #include <cmath> #include <cstdio> #inc ...

  9. 【HDU】5370 Tree Maker 【树dp】

    传送门:[HDU]5370 Tree Maker my  code:my~~code: #include <bits/stdc++.h> using namespace std ;type ...

  10. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

最新文章

  1. Microsoft月度中文速递
  2. RT ROM boot简介
  3. mfc 怎么让键盘上下左右控制图片移动_[源码和文档分享]基于MFC的陨石撞飞机游戏设计与实现...
  4. 分享5个冷门而超级实用的在线网站,大家赶紧来看看吧!
  5. [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计
  6. java编程顺序,Java种的完整构造执行顺序(转)
  7. 【Machine Learning】TensorFlow实现K近邻算法预测房屋价格
  8. HP-UX 中配置Trusted System
  9. framework7日期插件使用
  10. Unity3d Asset Server启动问题
  11. Oracle中INSTR函数,及在DB2、Sybase中与Instr函数功能相同的函数
  12. Dubbo视频教程《基于Dubbo的分布式系统架构视频教程》--课程列表
  13. 蓝牙AVRCP协议解析
  14. 接口测试 Jmeter面试题
  15. [RK3288][Android6.0] 调试笔记 --- 播放搜狐视频会Crash问题
  16. 使用vue实现四级联动
  17. oracle+ebs+fsg报表,EBS 11i FSG报表用XML publish输出问题!!!!
  18. 重学React基础知识整理——组件间的另类通信“插槽”(五)
  19. 拆解易鑫2020:担保服务收入猛增,助贷业务营收占比超三成
  20. 在电脑上通过手机发短信

热门文章

  1. Markdown 写作类软件 MWeb 和 Ulysses谁更好
  2. 【AIgua小白之路】Windows10安装MySQL10.0.15Archive版 【手把手系列】
  3. Rad Controls_Q2_2006 注册机
  4. [synergy]两台机器公用键盘鼠标
  5. 微软从 Engine Yard 手中收购容器平台 Deis
  6. 《自己动手做交互系统》——1.2 制作过程
  7. Java中三层架构与MVC之间的显著区别
  8. WPF-14:绑定中数据模型必须为public问题
  9. MapReduce:详解Shuffle过程
  10. 小团队适合引入 Spring Cloud 微服务吗?