题目描述

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:

  1. 5 3
  2. 1 4
  3. 2 5
  4. 3 4
输出样例#1:

  1. 1
    题解:
    这道题,要画画图理解才行。其实就是要求
  2. 1.在每个区间里面都必须要有一棵树被砍。

  1. 2.并且每个区间里面都必须只有一棵树被砍。
  2. 这两句话很关键。于是我们可以根据这两个条件做dp
  3. 首先我们设f[i]为前i个树满足条件且最多能有多少树没有被砍,便有f[i]=max(f[j])+1
  4. 那么j的范围呢?
  5. 根据条件1,我们可以确定左边界
  6. (因为必须选,那么上一个区间也一定要选,故j一定是>=最靠近i左边的区间的左坐标)
  7. 根据条件2,我们可以确定右边界。
  8. (因为必须选一个,所以包含i的区间里面的任意一个j都不能转移,即j<=包含i的区间的最小的左坐标)
  9. 故我们可以根据这些限定用单调队列来优化原来的dp方程。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. struct Messi
  7. {
  8. int l,r;
  9. }a[];
  10. int n,m,rp[],lp[],q[],f[];
  11. int main()
  12. {int i,j,head,tail;
  13. //freopen("search.in","r",stdin);
  14. //freopen("search.out","w",stdout);
  15. cin>>n>>m;
  16. for (i=;i<=n+;i++)
  17. rp[i]=i-;
  18. for (i=;i<=m;i++)
  19. {
  20. scanf("%d%d",&a[i].l,&a[i].r);
  21. lp[a[i].r+]=max(lp[a[i].r+],a[i].l);
  22. rp[a[i].r]=min(rp[a[i].r],a[i].l-);
  23. }
  24. for (i=n;i>=;i--) rp[i]=min(rp[i],rp[i+]);
  25. for (i=;i<=n+;i++) lp[i]=max(lp[i],lp[i-]);
  26. j=;
  27. head=tail=;
  28. for (i=;i<=n+;i++)
  29. {
  30. while (j<=rp[i]&&j<=n)
  31. {
  32. if (f[j]==-)
  33. {
  34. j++;
  35. continue;
  36. }
  37. while (f[j]>f[q[tail]]&&tail>=head) tail--;
  38. ++tail;
  39. q[tail]=j;
  40. j++;
  41. }
  42. while (q[head]<lp[i]&&head<=tail) head++;
  43. if (head<=tail) f[i]=f[q[head]]+(i!=n+?:);
  44. else f[i]=-;
  45. }
  46. if (f[n+]!=-)
  47. cout<<f[n+];
  48. else cout<<-;
  49. }
  1.  
  1.  

[USACO13OPEN]照片Photo的更多相关文章

  1. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  2. P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)

    题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...

  3. P3084 [USACO13OPEN]照片Photo

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

  4. 洛谷3084 [USACO13OPEN]照片Photo

    原题链接 神仙\(DP\)啊... 题解请移步隔壁大佬的博客\(QAQ\) #include<cstdio> using namespace std; const int N = 2e5 ...

  5. Luugu 3084 [USACO13OPEN]照片Photo

    很神仙的dp...假装自己看懂了,以后回来复习复习... 设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最大数量. 一个区间有两个限制条件:至少放一个,至多放一个. 因为一个区间至多要放一 ...

  6. P3084 [USACO13OPEN]照片Photo dp

    题意: 有n个区间,每个区间只能有一个斑点奶牛,问最多有几个斑点奶牛. 思路: 首先要处理出每个点的L[i],R[i]. L[i]表示L[i]-i-1之间一定有一个点.i也是选中的. R[i]表示R[ ...

  7. [USACO13OPEN]照片Photo 题解

    题面 这道题似乎可以用单调队列优化DP做,但这里讲的是一种差分约束的思路; 设s[i]表示1~i中选了多少个: s[b[i]]-s[a[i]-1]<=1; s[b[i]]-s[a[i]-1]&g ...

  8. 【简●解】[USACO] 照片Photo

    [简●解][USACO] 照片Photo [题目大意] 在\(1\)~\(N\)的序列上有\(M\)个区间,使得这\(M\)个小区间每个覆盖了且仅覆盖了一个点,求最多点数,如果无解,输出\(-1\). ...

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

    (已经有了简化版题面) 又秒了一次dp233 本来按照感觉瞎写了一发... 但还是老老实实列式子吧.... 对差分约束有了更深的理解 #include<cstdio> #include&l ...

随机推荐

  1. python 堆排序

    堆排序就是把堆顶的最大数取出, 将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现 剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时 ...

  2. Swift 2.2 的新特性

    导读:本文来自SwiftGG翻译组,作者@walkingway基于苹果Swift官方博客中Ted Kremenek所撰写的"Swift 2.2 Released!"文章进行了关于S ...

  3. ajax的四种type类型

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  4. 11-移动端开发教程-zepto.js入门教程

    Zepto.js是一个轻量级的针对现代浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto. 1. Why Zepto.js? API类 ...

  5. JAVA_SE基础——65.StringBuffer类 ②

    字符串特点:字符串是常量:它们的值在创建之后不能更改.    字符串的内容一旦发生了变化,那么马上会创建一个新 的对象.    注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象 ...

  6. 分布式系统之消息中间件rabbitmq

    分布式系统之消息中间件rabbitmq 博客分类: 感谢:  一般php 用rabbitmq  java 用activemq  http://spartan1.iteye.com/blog/11802 ...

  7. JavaScript Cookie使用实例

    # Session-Cookie //  利用Cookie防止在1分钟内多次提交: function SetCookie (name, value) { var Days = 30; var exp ...

  8. egg.js 的优缺点

    egg.js 的优缺点 优点 所有的 web开发的点都考虑到了 agent 很有特色 文件夹规划到位 扩展能力优秀 缺点 最大的问题在于: 使用 loader 加载之后,失去了代码提示的能力 监控和运 ...

  9. Python内置函数(64)——classmethod

    英文文档: classmethod(function) Return a class method for function. A class method receives the class as ...

  10. Python内置函数(50)——issubclass

     英文文档: issubclass(class, classinfo) Return true if class is a subclass (direct, indirect or virtual) ...