[USACO13OPEN]照片Photo 题解
这道题似乎可以用单调队列优化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;
- #include <bits/stdc++.h>
- using namespace std;
- struct littlestar{
- int to;
- int nxt;
- int w;
- }star[2000010];
- int head[2000010],cnt;
- void add(int u,int v,int w)
- {
- star[++cnt].to=v;
- star[cnt].nxt=head[u];
- star[cnt].w=w;
- head[u]=cnt;
- }
- int n,m;
- deque<int> q;
- int dis[1000010],vis[1000010];
- bool SPFA()
- {
- for(register int i=1;i<=n;i++) dis[i]=999999999;
- dis[0]=0;
- vis[0]=1;
- int tot=0;
- q.push_back(0);
- while(q.size()){
- int u=q.front();
- q.pop_front();
- vis[u]=0;
- for(register int i=head[u];i;i=star[i].nxt){
- int v=star[i].to;
- if(dis[v]>dis[u]+star[i].w){
- dis[v]=dis[u]+star[i].w;
- if(!vis[v]){
- vis[v]=1;
- ++tot;
- if(tot>2*(n+m)) return 0;
- if(q.size()&&dis[v]>dis[q.front()]) q.push_back(v);
- else q.push_front(v);
- }
- }
- }
- }
- if(dis[n]==999999999) return 0;
- return 1;
- }
- int main()
- {
- cin>>n>>m;
- for(register int i=1;i<=m;i++){
- int u,v;
- scanf("%d%d",&u,&v);
- u--;
- add(u,v,1);
- add(v,u,-1);
- }
- for(register int i=1;i<=n;i++){
- add(i-1,i,1);
- add(i,i-1,0);
- }
- if(SPFA()) cout<<dis[n]<<" ";
- else cout<<"-1";
- }
[USACO13OPEN]照片Photo 题解的更多相关文章
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- [USACO13OPEN]照片Photo
题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N < ...
- P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)
题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...
- 洛谷3084 [USACO13OPEN]照片Photo
原题链接 神仙\(DP\)啊... 题解请移步隔壁大佬的博客\(QAQ\) #include<cstdio> using namespace std; const int N = 2e5 ...
- P3084 [USACO13OPEN]照片Photo
题目描述 农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N. 于是约翰拍摄了M(1 <= M <= 100,00 ...
- Luugu 3084 [USACO13OPEN]照片Photo
很神仙的dp...假装自己看懂了,以后回来复习复习... 设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最大数量. 一个区间有两个限制条件:至少放一个,至多放一个. 因为一个区间至多要放一 ...
- P3084 [USACO13OPEN]照片Photo dp
题意: 有n个区间,每个区间只能有一个斑点奶牛,问最多有几个斑点奶牛. 思路: 首先要处理出每个点的L[i],R[i]. L[i]表示L[i]-i-1之间一定有一个点.i也是选中的. R[i]表示R[ ...
- 【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], ...
- 【简●解】[USACO] 照片Photo
[简●解][USACO] 照片Photo [题目大意] 在\(1\)~\(N\)的序列上有\(M\)个区间,使得这\(M\)个小区间每个覆盖了且仅覆盖了一个点,求最多点数,如果无解,输出\(-1\). ...
随机推荐
- JavaScript 数组2—关联数组
㈠什么是关联数组 可以自定义下标名称的数组 ㈡为什么 索引数组中的数字下标没有明确的意义 ㈢何时 只希望每个元素都有专门的名称时 ㈣如何:2步 1)创建空数组 2)向空数组中添加新元素,并自定义下标名 ...
- JavaScript 算术运算符
处理数值的典型情景是数值计算. ㈠JavaScript 算术运算符 算术运算符对数值(文字或变量)执行算术运算. ㈡算术运算符 典型的算术运算会操作两个数值. ⑴这两个数可以是字面量: var x = ...
- Spring Boot教程(三十二)多数据源配置与使用(2)
Spring-data-jpa支持 对于数据源的配置可以沿用上例中DataSourceConfig的实现. 新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Re ...
- JS框架_(JQuery.js)绚丽的3D星空动画
百度云盘: 传送门 密码:8ft8 绚丽的3D星空动画效果(纯CSS) (3D星空动画可以用作网页背景,Gary为文本文字) <!doctype html> <html lang=& ...
- textarea 自动高度
textarea 自动撑开高度 var textAreaArr = document.querySelectorAll('.textarea'); for (var i = 0; i < tex ...
- 5、kubernetes资源清单之Pod应用190709
一.Pod镜像及端口 获取帮助文档 # kubectl explain pod.spec.containers spec.containers <[]object> pod.spec.co ...
- Linux高级调试与优化——Address Sanitizer
Address Sanitizer ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了Addre ...
- C++抽象类实践
实践如下: #include <iostream> using namespace std; class Service { public: // 有一个虚函数即为抽象类 int id; ...
- Cross-Multimedia dataset
Wikipedia: http://www.svcl.ucsd.edu/projects/crossmodal/ PKU Xmedia: https://github.com/yeqinglee/mv ...
- 从txt导入数据到mysql
当要往mysql的table中录入数据量大的时候,直接从txt录入已有数据是一个愉快的选择. 在录入数据前要做一些格式上的准备 1. txt编码要是utf-8,无BOM 2. 每行以\t\n结尾,每列 ...