传送门

考虑把总区间长度减去最多能减少的区间长度

把所有区间离散化,对每一小段计算贡献

分类讨论一波,对于边界 $i,i+1$ ,设它们之间距离 $d$,$i$ 属于 $x$ 考察队的边界,$i+1$ 属于 $y$ 考察队的边界:

  $i$ 为左边界,$i+1$ 为左边界,显然如果给 $x$ 钥匙就可以让这一段时间关门,给 $x$ 的贡献 $val[x]$ 加上 $d$ ,表示给 $x$ 钥匙得到的贡献

  $i$ 为左边界,$i+1$ 为右边界,如果 $x=y$ ,显然给 $x$ 钥匙就可以让这段时间关门,那么给 $val[x]$ 加 $d$

    如果不为同一个考察队,那么如果要得到这一段的价值就必须同时给两个考察队钥匙,就从 $x$ 往 $y$ 连一条边权为 $d$ 的单向边,表示 $x,y$ 都有钥匙得到的贡献

  $i$ 为右边界,$i+1$ 为左边界,那么这一段显然关门就好,直接给答案加上 $d$

  $i$ 为右边界,$i+1$ 为右边界,那么给 $y$ 钥匙就可以让这段时间关门,所以 $val[y]+=d$

  (注意此时不用考虑 $x$ 能不能进来,$x$ 在之前就已经考虑过了)

发现这的图是由几条链组成的,所以可以对每条链分别 $dp$

设 $f[i][j][1/0]$ 表示前 $i$ 个点,给了 $j$ 个点钥匙,当前点 $i$ 选$/$不选的最大代价

具体实现起来还有点难度,看代码吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=5e3+,INF=1e9+;
int n,K,tot,ans;
int pos[N],val[N],eval[N],nex[N];//eval是边的价值,nex存边
map <int,int> mp;//维护某个位置的编号
int id[N],f[][][];//id是新的编号(同一条链的编号连续),f是dp数组
bool vis[N];//是否被重新编号过
void dfs(int x) { vis[ id[++tot]=x ]=; if(nex[x]) dfs(nex[x]); }//给一条链的每个节点编号
int main()
{
n=read(),K=read();
int l,r;
for(int i=;i<=n;i++)
{
l=read(),r=read();
mp[l]=i<<; mp[r]=i<<|;//编号
pos[i]=l; pos[n+i]=r;//存位置,注意位置都是左闭右开的!
}
sort(pos+,pos+(n<<)+);//排序
int res=;
for(int i=;i<(n<<);i++)//对每一小段分类讨论
{
l=pos[i],r=pos[i+];
int ld=mp[l],rd=mp[r];
if( !(ld&) )//i为左边界
{
if( !(rd&) ) val[ld>>]+=r-l;//i+1为左边界
else//i+1为右边界
{
if( (ld|)==rd ) val[ld>>]+=r-l;//如果属于同一点
else nex[ld>>]=(rd>>),eval[ld>>]=r-l;
}
}
else//i为右边界
{
if( !(rd&) ) res+=r-l;//i+1为左边界
else val[rd>>]+=r-l;//i+1为右边界
}
}
for(int i=n<<;i;i--)//注意从后往前找,要让链的节点编号连续
{
int d=mp[pos[i]];
if( !(d&) && !vis[d>>] ) dfs(d>>);
}
memset(f,~0x3f,sizeof(f));//记得初始化
f[tot+][][]=;
for(int i=tot;i;i--)
{
f[i][][]=;
for(int j=;j<=min(K,tot-i+);j++)
{
f[i][j][]=max(f[i+][j][],f[i+][j][]);
f[i][j][]=max(f[i+][j-][], f[i+][j-][]+eval[ id[i] ] )+val[ id[i] ];
}
}
printf("%d", pos[n<<]-pos[]-res-max(f[][K][],f[][K][]) );
return ;
}

P4890 Never·island的更多相关文章

  1. P4890 Never·island(dp)

    P4890 Never·island 求门开的最小时间,其实也就是求门关的最大时间. 坐标这么大....显然坐标要离散化 离散化排序后,我们发现x轴被这些点划分成若干条线段$(l,r)$,并且有4种情 ...

  2. [LeetCode] Island Perimeter 岛屿周长

    You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...

  3. 463. Island Perimeter

    https://leetcode.com/problems/island-perimeter/ 在一个N×N的矩阵中,N<100,1代表岛,0代表海,岛内没有海,求岛的周长 [[0,1,0,0] ...

  4. Leetcode-463 Island Perimeter

    #463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...

  5. LeetCode Island Perimeter

    原题链接在这里:https://leetcode.com/problems/island-perimeter/ 题目: You are given a map in form of a two-dim ...

  6. sicily1024 Magic Island(图的遍历)

    Description There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. ...

  7. codeforce B Island Puzzle

    B. Island Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. cf.301.D. Bad Luck Island(dp + probabilities)

    D. Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. [CareerCup] 6.4 Blue Eyes People on Island 岛上的蓝眼人

    6.4 A bunch of people are living on an island, when a visitor comes with a strange order: all blue-e ...

随机推荐

  1. Oracle——SQL基础

    一.SQL语句分为以下三种类型: DML: Data Manipulation Language 数据操纵语言DDL: Data Definition Language 数据定义语言DCL: Data ...

  2. linux命令下载安装软件

    在ubuntu下获取对应内核源码命令 Ubuntu的包管理系统,为您提供了一种高效快捷的软件管理方式,您只要知道您需要什么软件就可以了,甚至不需要关心它存放在网络上的哪一台服务器中,而且绝大多数的软件 ...

  3. ASP.NET MVC 3 and the @helper syntax within Razor

    Friday, May 13, 2011 ASP.NET MVC 3 supports a new view-engine option called “Razor” (in addition to ...

  4. (转)基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    原文地址:http://www.cnblogs.com/wuhuacong/p/3317223.html 在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中 ...

  5. HTML5拓扑3D机房,电力工控Web SCADA

    http://www.hightopo.com/cn-index.html 一套丰富的JavaScript界面类库, 提供完整的基于HTML5图形界面组件库.使用HT for Web您可以轻松构建现代 ...

  6. c#缓存介绍

    #缓存介绍(转) 本章导读 缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大 ...

  7. Floyd-Warshall求图中任意两点的最短路径

    原创 除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径. 从图中任取两点A.B,A到B的最短路径无非只有两种情况: 1:A直接到B这条路径即是最短 ...

  8. jquery中attr和prop的区别(转)

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...

  9. Android自动提示控件:AutoCompleteTextView和MultiAutoCompleteTextView

    在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的. 一.AutoCompleteTextView:单一匹配 ...

  10. 认识学习MVC这家伙

    通过最近的学习认识,只能感慨这玩意太强大了! 以前看了一些MVC的入门教程,看入门教程我感觉不能去体会它的强大,可以看看它的扩展点,通过扩展点去真正的试着了解它,体会它的强大. 它的验证.模型绑定提供 ...