zoukankan      html  css  js  c++  java
  • 【洛谷P3084】照片Photo【单调队列dp】

    题目大意:

    题目链接:https://www.luogu.org/problem/P3084
    一个长度为nn的序列,给出mm个二元组(l,r)(l,r),表示[l,r][l,r]中有且仅有一个数字1。求该01序列中最多含有多少个1。


    思路:

    60pts60pts

    题型很明显是差分约束。
    对于其中一个二元组(l,r)(l,r),我们需要满足的是s[r]s[l1]=1s[r]-s[l-1]=1,所以就变成s[r]s[l1]+1,s[r]s[l1]+1s[r]leq s[l-1]+1,s[r]geq s[l-1]+1
    然后显然任意一个数字只能选或不选,所以有s[i]s[i1]1,s[i]s[i1]0s[i]-s[i-1]leq 1,s[i]-s[i-1]geq0,变一下型就可以了。
    但是这样会被卡。。。只能拿到60分。
    代码链接


    100pts100pts

    我们设f[i]f[i]表示在位置ii必放1,前ii个数字中1最多的个数。
    那么既然在位置ii选择了1,那么所有含有位置ii的区间都不可以选1。
    r[i]=min(lxi(lx,rx))r[i]=min(l_x|iin (l_x,r_x))。这样的话,r[i]i1r[i]sim i-1都不可以选择1。
    但是因为每个区间至少要有一个1,所以不含ii的区间都必须要有1。
    l[i]=max(lxlx<i)l[i]=max(l_x|l_x<i),那么在lxl_x的右区间内必然会至少有一个1。
    所以位置ii的上一个1的区间范围就是[l[i],r[i]][l[i],r[i]]
    由于要求最大,就用单调队列维护一下就可以了。


    代码:

    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N=200010;
    int n,m,f[N],l[N],r[N];
    deque<int> q;
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n+1;i++)
    		r[i]=i-1;
    	for (int i=1,x,y;i<=m;i++)
    	{
    		scanf("%d%d",&x,&y);
    		l[y+1]=max(l[y+1],x);
    		r[y]=min(r[y],x-1);
    	}
    	for (int i=2;i<=n+1;i++)
    		l[i]=max(l[i-1],l[i]);
    	for (int i=n;i>=1;i--)
    		r[i]=min(r[i],r[i+1]);
    	int j=1;
    	q.push_back(0);
    	for (int i=1;i<=n+1;i++)
    	{
    		while (q.size()&&q.front()<l[i]) q.pop_front();
    		for (;j<=r[i]&&j<=n+1;j++)
    		{
    			if (j<l[i] || f[j]<0) continue;
    			while (q.size()&&f[q.back()]<f[j]) q.pop_back();
    			q.push_back(j);
    		}
    		if (q.size()) f[i]=f[q.front()]+1;
    			else f[i]=-1;
    	}
    	if (f[n+1]>0) printf("%d
    ",f[n+1]-1);
    		else printf("-1");
    	return 0;
    }
    
  • 相关阅读:
    Android 关于ExpandableListView控件setOnChildClickListener无效问题
    Android SnapHelper
    Android java判断字符串包含某个字符段(或替换)
    Android中的CharSequence和String
    Java时间和时间戳的相互转换
    比较运算符和函数(四十一)
    数值运算符和函数(四十)
    字符函数(三十九)
    多表删除(三十八)
    无限级分类表设计(三十七)
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998081.html
Copyright © 2011-2022 走看看