题目描述

Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always, are conveniently numbered from 1..N. Accordingly, he snapped M (1 <= M <= 100,000) photos, each covering a contiguous range of cows: photo i contains cows a_i through b_i inclusive. The photos collectively may not necessarily cover every single cow.

After taking his photos, FJ notices a very interesting phenomenon: each photo he took contains exactly one cow with spots! FJ was aware that he had some number of spotted cows in his herd, but he had never actually counted them. Based on his photos, please determine the maximum possible number of spotted cows that could exist in his herd. Output -1 if there is no possible assignment of spots to cows consistent with FJ's photographic results.

农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N。

于是约翰拍摄了M(1 <= M <= 100,000)张照片,每张照片都覆盖了连续一段奶牛:第i张照片中包含了编号a_i 到 b_i的奶牛。但是这些照片不一定把每一只奶牛都拍了进去。

在拍完照片后,约翰发现了一个有趣的事情:每张照片中都有且仅有一只身上带有斑点的奶牛。约翰意识到他的牛群中有一些斑点奶牛,但他从来没有统计过它们的数量。 根据照片,请你帮约翰估算在他的牛群中最多可能有多少只斑点奶牛。如果无解,输出“-1”。

Input

输入输出格式

输入格式:

* Line 1: Two integers N and M.

* Lines 2..M+1: Line i+1 contains a_i and b_i.

输出格式:

* Line 1: The maximum possible number of spotted cows on FJ's farm, or -1 if there is no possible solution.

输入输出样例

输入样例#1:

5 3
1 4
2 5
3 4

输出样例#1:

1

说明

There are 5 cows and 3 photos. The first photo contains cows 1 through 4, etc.

From the last photo, we know that either cow 3 or cow 4 must be spotted. By choosing either of these, we satisfy the first two photos as well.

题解

神仙般的dp……第一眼以为是差分约束……后来发现居然可以用dp乱搞……

用$f[i]$表示到第i个位置为止且第i个位置必放,最多能放多少个

因为有两个限制条件:每个区间至少一个,每个区间至多一个

因为一个区间至多一个,所以所有包含这个点的区间都不能再放,要找到所有包含这个点的区间中最小的左端点,令$r[i]=左端点-1$

因为一个区间至少一个,所以不能有地方空着不放,找到整个区间在当前点之前的区间,取最大的左端点,令$l[i]=左端点$

每一次读入的时候,用$x$更新$l[y+1]$用x-1更新$x-1$更新$r[y]$

然后正着扫一遍,用$l[i-1]$更新$l[i]$(在i-1之前的左端点必定在i之前);然后倒着扫一遍,用$r[i+1]$更新$r[i]$

所以$f[i]=max\{f[j]+1,l[i]<=j<=r[i]\}$,开个单调队列优化

 1 //minamoto
 2 #include<bits/stdc++.h>
 3 #define N 200005
 4 using namespace std;
 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<15,stdin),p1==p2)?EOF:*p1++)
 6 char buf[1<<15],*p1=buf,*p2=buf;
 7 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
 8 template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
 9 inline int read(){
10     #define num ch-'0'
11     char ch;bool flag=0;int res;
12     while(!isdigit(ch=getc()))
13     (ch=='-')&&(flag=true);
14     for(res=num;isdigit(ch=getc());res=res*10+num);
15     (flag)&&(res=-res);
16     #undef num
17     return res;
18 }
19 int n,m,l[N],r[N];
20 int h,t,q[N],f[N];
21 int main(){
22     //freopen("testdata.in","r",stdin);
23     n=read(),m=read();
24     for(int i=1;i<=n+1;++i) r[i]=i-1;
25     for(int i=1;i<=m;++i){
26         int x=read(),y=read();
27         cmin(r[y],x-1);
28         cmax(l[y+1],x);
29     }
30     for(int i=n;i>=1;--i) cmin(r[i],r[i+1]);
31     for(int i=2;i<=n+1;++i) cmax(l[i],l[i-1]);
32     int j=1;h=t=1,q[1]=0;
33     for(int i=1;i<=n+1;++i){
34         while(j<=r[i]&&j<=n){
35             if(f[j]==-1){++j;continue;}
36             while(f[j]>f[q[t]]&&h<=t) --t;
37             q[++t]=j;
38             ++j;
39             }
40         while(q[h]<l[i]&&h<=t) ++h;
41         if(h<=t) f[i]=f[q[h]]+(i!=n+1?1:0);
42         else f[i]=-1;
43     }
44     printf("%d\n",f[n+1]);
45     return 0;
46 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9375444.html

[USACO13OPEN]照片Photo相关推荐

  1. P3084 [USACO13OPEN]照片Photo(差分约束)

    题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...

  2. P3084 [USACO13OPEN]照片Photo 差分约束

    农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N. 于是约翰拍摄了M(1 <= M <= 100,000)张照片 ...

  3. P3084 [USACO13OPEN]照片Photo

    单调队列DP/差分约束 差分约束会TLE 讲解在这里 #include<bits/stdc++.h> using namespace std;#define go(i,a,b) for(i ...

  4. luogu P3084 [USACO13OPEN]照片Photo

    analysis 不等式组: (ai,bi)=>{xbi−xai<=1xbi−xai>=1(a_i,bi)=>\begin{cases} x_{b_i}-x_{a_i}< ...

  5. 洛谷 P3084 [USACO13OPEN]照片Photo

    https://daniu.luogu.org/problem/show?pid=3084 单调性dp 我靠你看到这个题目,怎么看都和查分约束有点关系对不对: 估计是我差分约束学的不好,也找不到为什么 ...

  6. [spfa][差分约束] 洛谷 P3084 照片Photo

    题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...

  7. 2019.2-2019.3 TO-DO LIST

    DP P2723 丑数 Humble Numbers(完成时间:2019.3.1) P2725 邮票 Stamps(完成时间:2019.3.1) P1021 邮票面值设计(完成时间:2019.3.1) ...

  8. .Net 项目代码风格规范

    最近没啥时间自己状态也不是很好,公司的事情忙,自己也有一些事情要处理,所以好久没有写博客了.利用公司午休时间写一写,以下是参考了一些资料,整理出来,共勉之. 代码风格没有正确与否,重要的是整齐划一,清 ...

  9. php鼠标经过显示文本,CSS_HTML和CSS做网页实例教程:鼠标滑过文字改变,关于HTML+CSS的实例效果很多, - phpStudy...

    关于HTML+CSS的实例效果很多,下面举出常用的几列,供新手们学习参考. html+CSS实例效果(1):鼠标滑过改变文字 鼠标经过变换文字 #Menu{ width:500px; margin:5 ...

最新文章

  1. 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
  2. 定点量化误差python仿真.零极点(1)
  3. SyntaxError: Non-UTF-8 code starting with ‘\xe4‘ in file解决办法
  4. YII2 - Yii 2 控制器不能包含大写字母的Bug
  5. SAP的软件是如何深刻影响着世界的?
  6. 51Nod 1079 中国剩余定理 Label:数论
  7. mysql数据表添加数值_MySQL中数据表和数据的操作
  8. MethodInterceptor拦截器
  9. 针对金融级交易场景的严苛技术要求,如何修炼这门“必修课”?
  10. 微服务esb_深入理解微服务架构:银弹or焦油坑?
  11. Lightingroom4_秋凉教程 P3-P31笔记
  12. php+aira2+ffmpeg下载m3u8文件并保存成mp4
  13. CTF练习题——bugkuCTF 网站被黑题目思路分析
  14. 深圳app上架-2021年上半年android ios app上架价格一览
  15. repository ‘Gradle Libs‘ was added by unknown code
  16. Floyd 算法+例题
  17. 2019最新 BAT、TMD等公司技术面试题及其答案
  18. 华为校招JAVA机试题
  19. 【linux性能优化】软中断的理解及问题定位
  20. 2022.3.17 关于镜头标称焦距和相机标定的焦距的差异

热门文章

  1. 十分钟带你了解XXE
  2. html实现经典坦克大战小游戏
  3. 哪个 DB2 9.7 发行版适合您?
  4. java如何求迭代器长度_获取handlebar java中迭代器列表的长度
  5. 什么是VI设计?VI设计有什么作用?
  6. 基于Matlab/Simulink的气液缓冲器动态特性仿真与分析
  7. JavaScript 学习-48.$.ajaxSetup方法设置AJAX的全局默认设置
  8. [LeetCode] LeetCode中与有向图相关的题目总结
  9. java字符串如何计算_关于Java:如何正确计算字符串字节?
  10. 什么是闭包以及闭包的特点