[USACO13OPEN]照片Photo [动态规划 单调队列]

[USACO13OPEN]照片Photo
这题好烧脑...

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rg register
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)>(y)?(y):(x))
const int N=2e5+5,M=1e5+5,inf=0x3f3f3f3f,P=19650827;
int n,m,mxl[N],mnl[N],q[N],f[N];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int main(){
    freopen("in2.txt","r",stdin);
    //freopen("xor.out","w",stdout);
    rd(n),rd(m);
    for(int i=1;i<=n+1;++i) mnl[i]=i-1;
    for(int i=1,l,r;i<=m;++i)
        rd(l),rd(r),mnl[r]=Min(mnl[r],l-1),mxl[r+1]=Max(mxl[r+1],l);
    for(int i=n;i;--i) mnl[i]=Min(mnl[i],mnl[i+1]);
    for(int i=2;i<=n+1;++i) mxl[i]=Max(mxl[i],mxl[i-1]);
    int h=1,t=1,j=1;
    for(int i=1;i<=n+1;++i){
        while(j<=mnl[i]&&j<=n){
            if(f[j]==-1){++j;continue;}
            while(f[j]>f[q[t]]&&t>=h) --t;
            q[++t]=j++;
        }
        while(q[h]<mxl[i]&&h<=t) ++h;
        if(h<=t) f[i]=f[q[h]]+(i!=n+1?1:0);
        else f[i]=-1;
    }
    printf("%d",f[n+1]);
    return 0;
}

原文地址:https://www.cnblogs.com/lxyyyy/p/11380096.html

时间: 2024-10-09 00:30:43

[USACO13OPEN]照片Photo [动态规划 单调队列]的相关文章

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

题目链接:传送门 题目: 题目描述 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

[USACO13OPEN]照片Photo

题目描述 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 r

【DP专题】——[USACO13OPEN]照片Photo

这道题是道非常好的动规题,不难但思考过程受益很大. [9/25日更新:鸽了俩个月回来补档了] 题目描述 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 <

BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1096 有\(n\)个工厂,给出第\(i\)个工厂的到1号工厂的距离\(x[i]\),货物数量\(p[i]\),建设仓库所需花费\(c[i]\). 现在要把所有货物都装入仓库,第\(i\)号工厂的货物可以选择在\(i\)建仓库并存入,或者移动到\(k\)号仓库\((i<k<=n)\).移动的花费为数量与距离的乘积. 分析 我们来想一想dp方程. 用\(dp[i]\)表示前\(i\)个工厂,且

BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\),要求将玩具分成若干段,从\(i\)到\(j\)分为一段的长度为\(x=j-i+\sum_(k=i)^jc[k]\),费用为\((x-l)^2\).求最小费用. 分析 用\(dp[i]\)表示前\(i\)个玩具所需的最小费用,则有$$dp[i]=min\{dp[j]+(sum[i]-sum[j]+

Luugu 3084 [USACO13OPEN]照片Photo

很神仙的dp...假装自己看懂了,以后回来复习复习... 设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最小代价. 一个区间有两个限制条件:至少放一个,至多放一个. 因为一个区间至多要放一个,所以所有包含这个点的区间都不能再放,设$r_{i}$表示包含这个点的区间中最小的左端点$ - 1$. 因为一个区间至少要放一个,所以不能有区间中一个都不放,设$l_{i}$表示整个区间在当前点之前的最大的左端点. 这样子就有了转移方程:$f_{i} = max(f_{j}) + 1$  $(l_

P3084 [USACO13OPEN]照片Photo

题目描述 农夫约翰决定给站在一条线上的N(1 <= N <= 200,000)头奶牛制作一张全家福照片,N头奶牛编号1到N. 于是约翰拍摄了M(1 <= M <= 100,000)张照片,每张照片都覆盖了连续一段奶牛:第i张照片中包含了编号a_i 到 b_i的奶牛.但是这些照片不一定把每一只奶牛都拍了进去. 在拍完照片后,约翰发现了一个有趣的事情:每张照片中都有一只身上带有斑点的奶牛.约翰意识到他的牛群中有一些斑点奶牛,但他从来没有统计过它们的数量. 根据照片,请你帮约翰估算在他的

详解--单调队列 经典滑动窗口问题

单调队列,即单调的队列.使用频率不高,但在有些程序中会有非同寻常的作用. 动态规划·单调队列的理解 做动态规划时常常会见到形如这样的转移方程: f[x] = max or min{g(k) | b[x] <= k < x} + w[x] (其中b[x]随x单调不降,即b[1]<=b[2]<=b[3]<=...<=b[n]) (g[k]表示一个和k或f[k]有关的函数,w[x]表示一个和x有关的函数) 这个方程怎样求解呢?我们注意到这样一个性质:如果存在两个数j, k,使

bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp

Description 给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点 Input * Line 1: Two integers N and M. * Lines 2..M+1: Line i+1 contains a_i and b_i. Output * Line 1: The maximum possible number of spotted cows on FJ's farm, or -1 if there is no possible solution. S