传送门

Description

  Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。

张贴规则如下:

  1. electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;

  2. 所有张贴的海报的高度必须与electoral墙的高度一致的;

  3. 每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;

  4. 后贴的海报可以覆盖前面已贴的海报或部分海报。

现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。

Input

  第一行: N M 分别表示electoral墙的长度和海报个数

  接下来M行: Ai Bi 表示每张海报张贴的位置

Output

  输出贴完所有海报后,在electoral墙上还可以看见的海报数。

Sample Input


Sample Output


Hint 

  10<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000

  所有的数据都是整数。数据之间有一个空格

Solution

  考虑暴力修改 上界复杂度将达到O(nm)。显然扯淡。

  考虑进行优化。由于是对区间操作。最后输出答案也相当于对区间[1,n]进行询问,于是自然想到对区间操作最拿手的线段树。

  如果在线修改,记录区间上有几个广告,以及区间上广告是否覆盖完全(即最右侧的广告在区间外是否还有一块),合并时f[p]=f[dp]+f[ddp](+1),会产生问题:如样例图片:

          

观察样例中间被英文标出的地方,使用上述算法,改区间会被判定为有三个广告。但事实上只有两个,因为是上面覆盖了下面的一部分。

  如何解决此问题?考虑广告数量太大无法状压,但不强制在线,于是我们把广告都读进来,倒序插入。因为较早贴上的广告显然无法影响到后面的广告。这里再次使用了阶段划分和无后效性的思想。对于一个区间,如果已经被提前计算的广告完全覆盖,则直接return。一个广告能被看见,当且仅当他能覆盖一个独立的区间。至此,问题得解。

Code

#include<cstdio>
#include<algorithm>
#define ci const int
#define maxn 10000010
#define maxt 40000010 inline void qr(int &x) {
char ch=getchar(),last=' ';
while(ch>''||ch<'') last=ch,ch=getchar();
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
if(last=='-') x=-x;
} inline int max(const int &a,const int &b) {if(a>b) return a;return b;}
inline int min(const int &a,const int &b) {if(a<b) return a;return b;}
inline int abs(const int &a) {if(a>=) return a;return -a;} inline void swap(int &a,int &b) {int temp=a;a=b;b=temp;} int n,m,a,b,cnt; bool tree[maxt],judge; struct M {
int l,r;
};
M MU[maxn]; void change(ci l,ci r,ci p,ci aiml,ci aimr) {
if(l>r) return;
if(l>aimr||r<aiml) return;
if(l>=aiml&&r<=aimr) {if(!tree[p]) tree[p]=judge=true;return;}
if(tree[p]) return;
int mid=(l+r)>>,dp=p<<,ddp=dp|;
change(l,mid,dp,aiml,aimr);change(mid+,r,ddp,aiml,aimr);
tree[p]=tree[dp]&&tree[ddp];
} int main() {
qr(n);qr(m);
for(int i=;i<=m;++i) {qr(MU[i].l);qr(MU[i].r);}
do {
judge=false;
change(,n,,MU[m].l,MU[m].r);
if(judge) ++cnt;
} while(--m);
printf("%d\n",cnt);
return ;
}

Summary

  1、阶段划分是做任何题十分有力的工具,除开DP外,也要时刻应用。
  2、在线难以处理时,考虑离线。正序难以处理时,考虑倒序。无序难以处理时,考虑有序。因为后者往往在一定程度上满足无后效性。

【线段树】【P3740】 [HAOI2014]贴海报的更多相关文章

  1. 【题解】Luogu P3740 [HAOI2014]贴海报

    woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq 这有可能是我最后一篇题解/博客qaq 原题传送门:P3740 [HAOI2014]贴海报 考前刷水题到底是对还是 ...

  2. Luogu P3740 [HAOI2014]贴海报_线段树

    线段树版的海报 实际上这个与普通的线段树相差不大,只是貌似数据太水,暴力都可以过啊 本来以为要离散的,结果没打就A了 #include<iostream> #include<cstd ...

  3. Luogu P3740 [HAOI2014] 贴海报 线段树

    线段树版的海报 实际上这个与普通的线段树相差不大,只是貌似数据太水,暴力都可以过啊 本来以为要离散的,结果没打就A了 #include<iostream> #include<cstd ...

  4. BZOJ 5168 && Luogu P3740 [HAOI2014]贴海报 线段树~~

    据说某谷数据十分水...但幸好BZOJ上也过了...话说我记得讲课时讲的是奇奇怪怪的离散化..但现在突然觉得什么都可以线段树瞎搞了...QAQ 直接就是这个区间有没有被覆盖,被覆盖直接return: ...

  5. poj 2528(线段树+离散化) 市长的海报

    http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...

  6. 洛谷P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  7. 洛谷 P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  8. P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  9. 【文文殿下】P3740 [HAOI2014]贴海报

    题解 一开始想到离散化,然后暴力模拟.但是存在一种hack数据: [5,7] [1,5] [7,9] 这样会错误的认为第一个区间被覆盖了(因为两个端点被覆盖).所以我们设置一个玄学调参系数,在一个区间 ...

随机推荐

  1. Python3.6+selenium3.8+Firefox5.7 环境搭建

    大家好,我是阿哲,本人是从php转岗过来学习测试的一名小菜! 在学习selenium过程中,发现运行selenium有很多的问题. 我们在利用pip install selenium 安装的最新版后, ...

  2. python3爬虫-快速入门-爬取图片和标题

    直接上代码,先来个爬取豆瓣图片的,大致思路就是发送请求-得到响应数据-储存数据,原理的话可以先看看这个 https://www.cnblogs.com/sss4/p/7809821.html impo ...

  3. Scala学习笔记之Actor多线程与线程通信的简单例子

    题目:通过子线程读取每个文件,并统计单词数,将单词数返回给主线程相加得出总单词数 package review import scala.actors.{Actor, Future} import s ...

  4. 查找 二叉树中 k1 到 k2区间的节点

    vector<int> res; int key1, key2; void traverse(TreeNode * root){//采用前序遍历 if(root == NULL) retu ...

  5. python leveldb 文档

    标签(空格分隔): python leveldb import leveldb db = leveldb.LevelDB('./db') db.Put('hello', 'world') print ...

  6. 将代码上传到GitHub

    网上看了很多资料,都是用的命令行,比较难看懂,自己摸索了一下怎么样在图形界面上操作.下面记录的只是简单的如何把本地仓库直接上传到服务器上. 在mac上下载个GitHub Mac客户端,安装好后运行,输 ...

  7. Swift-map()跟flatMap()区别

    map()方法介绍 map() 是  Array 提供的方法,通过接收一个函数作为传入参数,对数组中每个元素进行函数变换得到新的结果值.这样只需要提供  X->Y 的映射关系,就能将数组  [X ...

  8. TCP系列27—窗口管理&流控—1、概述

    在前面的内容中我们依次介绍了TCP的连接建立和终止过程和TCP的各种重传方式.接着我们在这部分首先关注交互式应用TCP连接相关内容如延迟ACK.Nagle算法.Cork算法等,接着我们引入流控机制(f ...

  9. 3dContactPointAnnotationTool开发日志(十八)

      今天实现了tab效果,按tab键可以在status面板的各个输入框内来回切换,参考Unity3D - UGUI实现Tab键切换输入框.按钮(按Tab键切换高亮显示的UI)

  10. Qt Creator子目录项目-类似VS解决方案

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt Creator子目录项目-类似VS解决方案     本文地址:http://techie ...