luogu 3740 [HAOI2014] 贴海报
题目
题目描述
Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。
张贴规则如下:
electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;
所有张贴的海报的高度必须与electoral墙的高度一致的;
每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;
后贴的海报可以覆盖前面已贴的海报或部分海报。
现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。
输入格式
第一行: N M 分别表示electoral墙的长度和海报个数
接下来M行: Ai Bi 表示每张海报张贴的位置
输出格式
输出贴完所有海报后,在electoral墙上还可以看见的海报数。
输入输出样例
100 5 1 4 2 6 8 10 3 4 7 10
4
说明/提示
注:图片来源:洛谷
【约束条件】
1 0<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000
所有的数据都是整数。数据之间有一个空格
分析
还有一种方法:浮水法:题解 P3740 【[HAOI2014]贴海报】
一个很妙的逆向思维
如果正向思考,覆盖的时候绞尽脑汁消除覆盖,很麻烦
看最后露出来的,只要前面没挡到,就会露出来,例如:
可以存入空白,倒向操作,只要覆盖了空白的海报,就会露出来
但在离散化的时候会出错,比如:
8 3
3 6
1 3
6 7
本来是:
离散化后3与6相邻,答案本应3,输出为2,变成了:
解决方法:在离散化时,不是消去中间,而是将中间距离大于1的变为1
注意数组大小
代码
![](/assets/blank.gif)
![](/assets/blank.gif)
1 /************************** 2 User:Mandy.H.Y 3 Language:c++ 4 Problem:luogu3740 5 Algorithm:线段树 + 离散化 6 **************************/ 7 8 // 一个很妙的逆向思维 9 //如果正向思考,覆盖的时候绞尽脑汁消除覆盖,很麻烦 10 //看最后露出来的,只要前面没挡到,就会露出来 11 //可以存入空白,倒向操作,只要覆盖了空白的海报,就会露出来 12 //但在离散化的时候会出错,比如: 13 //8 3 14 //3 6 15 //1 3 16 //6 7 17 //离散化后3与6相邻,答案本应3,输出为2 18 //解决方法:在离散化时,不是消去中间,而是将中间距离大于1的变为1 19 //注意数组大小 20 21 22 #include<bits/stdc++.h> 23 #define Max(x,y) ((x) > (y) ? (x) : (y)) 24 #define Min(x,y) ((x) < (y) ? (x) : (y)) 25 #define lson l,mid,k<<1 26 #define rson mid + 1,r,k<<1|1 27 28 using namespace std; 29 30 const int maxm = 2005; 31 int n,m,ans,judge = 0; 32 int tree[maxm << 4]; 33 34 struct Poster{ 35 int l,r; 36 }pos[maxm]; 37 38 struct Temp{ 39 int l,id; 40 bool operator < (const Temp &a)const { 41 return l < a.l; 42 } 43 }tmp[maxm << 1]; 44 45 template<class T>inline void read(T &x) { 46 x = 0;bool flag = 0;char ch = getchar(); 47 while(!isdigit(ch)) flag |= ch == '-',ch = getchar(); 48 while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = getchar(); 49 if(flag) x = -x; 50 } 51 52 template<class T>void putch(const T x) { 53 if(x > 9) putch(x / 10); 54 putchar(x % 10 | 48); 55 } 56 57 template<class T>void put(const T x) { 58 if(x < 0) putchar('-'),putch(-x); 59 else putch(x); 60 } 61 62 void file() { 63 freopen("3740.in","r",stdin); 64 // freopen("2161.out","w",stdout); 65 } 66 67 void readdata() { 68 read(n);read(m); 69 } 70 71 void pushup(int k){ 72 tree[k] = tree[k<<1] + tree[k<<1|1]; 73 } 74 75 void pushdown(int k){ 76 if(!tree[k]){ 77 tree[k<<1] = 0; 78 tree[k<<1|1] = 0; 79 }//标记下放 80 } 81 82 void buildtree(int l,int r,int k){ 83 if(l == r){ 84 tree[k] = 1; 85 return; 86 } 87 int mid = (l + r) >> 1; 88 buildtree(lson); 89 buildtree(rson); 90 pushup(k); 91 } 92 93 void modify(int l,int r,int k,int x,int y){ 94 if(x <= l && r <= y){ 95 if(tree[k]) judge = 1; 96 tree[k] = 0; 97 return; 98 } 99 pushdown(k); 100 int mid = (l + r) >> 1; 101 if(x <= mid) modify(lson,x,y); 102 if(y > mid) modify(rson,x,y); 103 pushup(k); 104 } 105 106 void work() { 107 int cnt = 0; 108 for(int i = 1;i <= m ; ++ i){ 109 read(tmp[++cnt].l);tmp[cnt].id = i; 110 read(tmp[++cnt].l);tmp[cnt].id = i; 111 } 112 113 sort(tmp + 1,tmp + cnt + 1); 114 int tot = 0;//去重 及 变为1 115 for(int i = 1;i <= cnt; ++ i){ 116 int id = tmp[i].id; 117 if(tmp[i].l != tmp[i - 1].l){ 118 if(tmp[i].l - tmp[i - 1].l > 1) ++tot; 119 if(pos[id].l) pos[id].r = ++tot; 120 else pos[id].l = ++tot; 121 } else { 122 if(pos[id].l) pos[id].r = tot; 123 else pos[id].l = tot; 124 } 125 126 } 127 128 buildtree(1,tot,1); 129 130 for(int i = m;i >= 1; -- i){ 131 judge = 0; 132 modify(1,tot,1,pos[i].l,pos[i].r); 133 if(judge) ans++; 134 } 135 put(ans); 136 } 137 138 int main() { 139 // file(); 140 readdata(); 141 work(); 142 return 0; 143 }
View Code
转载于:https://www.cnblogs.com/Mandy-H-Y/p/11403441.html
luogu 3740 [HAOI2014] 贴海报相关推荐
- 1682. [HAOI2014]贴海报
1682. [HAOI2014]贴海报 ★★☆ 输入文件:ha14d.in 输出文件:ha14d.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] Byteto ...
- [HAOI2014] 贴海报
题目描述: 线段树覆盖题目- 题目分析: 离散化+线段树区间更新,最后直接遍历一下整个线段树,把标记全部下放一下,最后O1查询就好了- 题目链接: BZOJ 5168 Luogu 3740 Ac 代码 ...
- [HAOI2014]贴海报
这道题我也是用线段树做的,也是区间覆盖. 比较好想首先读入所有输入,倒序处理,对于一张海报,查询其对应区间有没有被完全覆盖,完全覆盖表示后面贴的那些海报会将这张海报完全盖住,否则的话,这张海报就会被看 ...
- HAOI2014 贴海报 浮水法
好久没更博客了,最近回来刷题.今天做了一道2014年河南省选[贴海报],用到了浮水法,写篇博客. 适用:浮水法主要使用于有覆盖的染色问题. 方法本身的思想不难理解:(以[贴海报]为背景)想象所有的海报 ...
- 【HAOI2014】贴海报
弱省中的弱省-- 原题: Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下 ...
- luogu P1549 棋盘问题(2) 题解
luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...
- [Luogu] 选学霸
https://www.luogu.org/problemnew/show/P2170 并查集+DP #include <iostream> #include <cstring> ...
- Luogu 2470 [SCOI2007]压缩
和Luogu 4302 [SCOI2003]字符串折叠 差不多的想法,区间dp 为了计算方便,我们可以假设区间[l, r]的前面放了一个M,设$f_{i, j, 0/1}$表示区间$[i, j]$中是 ...
- 小程序画布画海报保存成图片可以保存实现完整代码
老规矩先来个效果图: 因为是截图所以会有些模糊,在真机上会比较清晰 下面针对效果图来看看里面都画了什么元素,代码在文章的最后,大家想直接拷代码可以略过这,这里是方便大家理解代码. 首先,咱们的海报有几 ...
最新文章
- Linux 查看交换区内容,Unix: Unix/Linux/Win的虚拟交换区信息的查看
- 6. ZigZag Conversion
- UVa563 - Crimewave
- MAC Opencv include选择
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
- Professional C# 6 and .NET Core 1.0 - Chapter 43 WebHooks and SignalR
- 常见Linux版本概览
- 3. Magento 模板制作
- C++中在使用自定义类型(结构体类型)的stl数据结构时,operate的用法
- 适配器自动分配的169开头的地址_代理ip地址怎么换
- vim打开bin文件
- matlab ss2ss,Zemax+DDE+toolbox+for+Matlab 该工具箱可实现matlab编程和zemax通信 - 下载 - 搜珍网...
- 龙芯电脑手动编译安装gcc9.3编译器
- kali工具之Beef
- 送书福利|少儿编程能够一玩就会吗?够胆量的家长,让孩子打卡30天玩会编程!...
- oracle使用text类型,oracle数据库中text类型用什么类型表示
- 正则表达式--常用用法及lookahead、lookbehind
- 携手并进,利尔达科技集团与中国计量大学举办捐赠签约仪式
- 《软技能 代码之外的生存指南》
- DVB-S2工作总结
热门文章
- Zabbix自动发现规则
- 金仓数据库 KingbaseES 异构数据库移植指南 (4. 应用迁移流程)
- xp系统桌面计算机不见了怎么办,xp我的电脑图标没了怎么办,xp系统桌面图标不见了...
- 国家企业信用信息公示系统每年申报登录提示账号不存在【山东】
- Windows部分快捷键命令/命令
- 利用LabVIEW开发应变量测试
- 我的人生就是一次次世界杯串起来的
- 4G信号变卡的主要原因
- Java实现 蓝桥杯 算法训练 删除数组零元素
- VS2012中的R6002 - floating point support not loaded错误