题面

这道题似乎可以用单调队列优化DP做,但这里讲的是一种差分约束的思路;

设s[i]表示1~i中选了多少个;

s[b[i]]-s[a[i]-1]<=1;

s[b[i]]-s[a[i]-1]>=1;

s[i]-s[i-1]<=1;

s[i]-s[i-1]>=0;

然后跑SPFA最短路;

但要注意:普通的SPFA根本就过不去,所以我们应该使用双端队列优化的梦想SPFA;

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct littlestar{
  4. int to;
  5. int nxt;
  6. int w;
  7. }star[2000010];
  8. int head[2000010],cnt;
  9. void add(int u,int v,int w)
  10. {
  11. star[++cnt].to=v;
  12. star[cnt].nxt=head[u];
  13. star[cnt].w=w;
  14. head[u]=cnt;
  15. }
  16. int n,m;
  17. deque<int> q;
  18. int dis[1000010],vis[1000010];
  19. bool SPFA()
  20. {
  21. for(register int i=1;i<=n;i++) dis[i]=999999999;
  22. dis[0]=0;
  23. vis[0]=1;
  24. int tot=0;
  25. q.push_back(0);
  26. while(q.size()){
  27. int u=q.front();
  28. q.pop_front();
  29. vis[u]=0;
  30. for(register int i=head[u];i;i=star[i].nxt){
  31. int v=star[i].to;
  32. if(dis[v]>dis[u]+star[i].w){
  33. dis[v]=dis[u]+star[i].w;
  34. if(!vis[v]){
  35. vis[v]=1;
  36. ++tot;
  37. if(tot>2*(n+m)) return 0;
  38. if(q.size()&&dis[v]>dis[q.front()]) q.push_back(v);
  39. else q.push_front(v);
  40. }
  41. }
  42. }
  43. }
  44. if(dis[n]==999999999) return 0;
  45. return 1;
  46. }
  47. int main()
  48. {
  49. cin>>n>>m;
  50. for(register int i=1;i<=m;i++){
  51. int u,v;
  52. scanf("%d%d",&u,&v);
  53. u--;
  54. add(u,v,1);
  55. add(v,u,-1);
  56. }
  57. for(register int i=1;i<=n;i++){
  58. add(i-1,i,1);
  59. add(i,i-1,0);
  60. }
  61. if(SPFA()) cout<<dis[n]<<" ";
  62. else cout<<"-1";
  63. }

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

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

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

  2. [USACO13OPEN]照片Photo

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

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

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

  4. 洛谷3084 [USACO13OPEN]照片Photo

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

  5. P3084 [USACO13OPEN]照片Photo

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

  6. Luugu 3084 [USACO13OPEN]照片Photo

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

  7. P3084 [USACO13OPEN]照片Photo dp

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

  8. 【luogu P3608 [USACO17JAN]Balanced Photo平衡的照片】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3608 乍一看很容易想到O(N^2)的暴力. 对于每个H[i]从i~i-1找L[i]再从i+1~n找R[i], ...

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

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

随机推荐

  1. JavaScript 数组2—关联数组

    ㈠什么是关联数组 可以自定义下标名称的数组 ㈡为什么 索引数组中的数字下标没有明确的意义 ㈢何时 只希望每个元素都有专门的名称时 ㈣如何:2步 1)创建空数组 2)向空数组中添加新元素,并自定义下标名 ...

  2. JavaScript 算术运算符

    处理数值的典型情景是数值计算. ㈠JavaScript 算术运算符 算术运算符对数值(文字或变量)执行算术运算. ㈡算术运算符 典型的算术运算会操作两个数值. ⑴这两个数可以是字面量: var x = ...

  3. Spring Boot教程(三十二)多数据源配置与使用(2)

    Spring-data-jpa支持 对于数据源的配置可以沿用上例中DataSourceConfig的实现. 新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Re ...

  4. JS框架_(JQuery.js)绚丽的3D星空动画

    百度云盘: 传送门 密码:8ft8 绚丽的3D星空动画效果(纯CSS) (3D星空动画可以用作网页背景,Gary为文本文字) <!doctype html> <html lang=& ...

  5. textarea 自动高度

    textarea 自动撑开高度 var textAreaArr = document.querySelectorAll('.textarea'); for (var i = 0; i < tex ...

  6. 5、kubernetes资源清单之Pod应用190709

    一.Pod镜像及端口 获取帮助文档 # kubectl explain pod.spec.containers spec.containers <[]object> pod.spec.co ...

  7. Linux高级调试与优化——Address Sanitizer

    Address Sanitizer ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了Addre ...

  8. C++抽象类实践

    实践如下: #include <iostream> using namespace std; class Service { public: // 有一个虚函数即为抽象类 int id; ...

  9. Cross-Multimedia dataset

    Wikipedia: http://www.svcl.ucsd.edu/projects/crossmodal/ PKU Xmedia: https://github.com/yeqinglee/mv ...

  10. 从txt导入数据到mysql

    当要往mysql的table中录入数据量大的时候,直接从txt录入已有数据是一个愉快的选择. 在录入数据前要做一些格式上的准备 1. txt编码要是utf-8,无BOM 2. 每行以\t\n结尾,每列 ...