【HDU】4391 Paint The Wall
题意:
给出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相关推荐
- 【HDU】3441 Rotation
题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围.用C ...
- 【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/ ...
- 【HDU】4942 Game on S♂play 线段树
传送门:[HDU]4942 Game on S♂play 题目分析:今天下午被这道题整死了,因为我的写法导致有的数可能变成负的,但是我们有察觉到,debug了一下午还是在吃饭的时候突然想到这个问题的. ...
- 【HDU】5238 Calculator 【中国剩余定理+线段树】
传送门:[HDU]5238 Calculator 题目分析: 模数可以拆成四个小素数:7,13,17,19. 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好.中间我们用线段树,保存每个 ...
- 【HDU】5197 DZY Loves Orzing 【FFT启发式合并】
传送门:[HDU]5197 DZY Loves Orzing 题目分析: 首先申明,我不会dpdp方程= =--这个东西给队友找出来了,然后我就是套这个方程做题的Qrz-- 对于这题,因为n2n^2个 ...
- 【HDU】1535 Invitation Cards 最短路
传送门:[HDU]1535 Invitation Cards 题目分析:题目真难读......其实题目的意思就是让求从编号为1的点到其他所有点的最短路距离之和加上其他所有点到编号为1的点的最短路距离之 ...
- 【HDU】4411 Arrest 费用流
传送门:[HDU]4411 Arrest 题目分析:题目的意思一开始没看懂= =...题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的).且 ...
- 【HDU】3271 SNIBB 数位DP
传送门:[HDU]3271 SNIBB 题目分析:第一问直接求,第二问就二分.水题. 代码如下: #include <cmath> #include <cstdio> #inc ...
- 【HDU】5370 Tree Maker 【树dp】
传送门:[HDU]5370 Tree Maker my code:my~~code: #include <bits/stdc++.h> using namespace std ;type ...
- 【HDU】4859 海岸线 黑白染色+最小割
传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...
最新文章
- Microsoft月度中文速递
- RT ROM boot简介
- mfc 怎么让键盘上下左右控制图片移动_[源码和文档分享]基于MFC的陨石撞飞机游戏设计与实现...
- 分享5个冷门而超级实用的在线网站,大家赶紧来看看吧!
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计
- java编程顺序,Java种的完整构造执行顺序(转)
- 【Machine Learning】TensorFlow实现K近邻算法预测房屋价格
- HP-UX 中配置Trusted System
- framework7日期插件使用
- Unity3d Asset Server启动问题
- Oracle中INSTR函数,及在DB2、Sybase中与Instr函数功能相同的函数
- Dubbo视频教程《基于Dubbo的分布式系统架构视频教程》--课程列表
- 蓝牙AVRCP协议解析
- 接口测试 Jmeter面试题
- [RK3288][Android6.0] 调试笔记 --- 播放搜狐视频会Crash问题
- 使用vue实现四级联动
- oracle+ebs+fsg报表,EBS 11i FSG报表用XML publish输出问题!!!!
- 重学React基础知识整理——组件间的另类通信“插槽”(五)
- 拆解易鑫2020:担保服务收入猛增,助贷业务营收占比超三成
- 在电脑上通过手机发短信
热门文章
- Markdown 写作类软件 MWeb 和 Ulysses谁更好
- 【AIgua小白之路】Windows10安装MySQL10.0.15Archive版 【手把手系列】
- Rad Controls_Q2_2006 注册机
- [synergy]两台机器公用键盘鼠标
- 微软从 Engine Yard 手中收购容器平台 Deis
- 《自己动手做交互系统》——1.2 制作过程
- Java中三层架构与MVC之间的显著区别
- WPF-14:绑定中数据模型必须为public问题
- MapReduce:详解Shuffle过程
- 小团队适合引入 Spring Cloud 微服务吗?