P4890 Never·island
考虑把总区间长度减去最多能减少的区间长度
把所有区间离散化,对每一小段计算贡献
分类讨论一波,对于边界 $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的更多相关文章
- P4890 Never·island(dp)
P4890 Never·island 求门开的最小时间,其实也就是求门关的最大时间. 坐标这么大....显然坐标要离散化 离散化排序后,我们发现x轴被这些点划分成若干条线段$(l,r)$,并且有4种情 ...
- [LeetCode] Island Perimeter 岛屿周长
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...
- 463. Island Perimeter
https://leetcode.com/problems/island-perimeter/ 在一个N×N的矩阵中,N<100,1代表岛,0代表海,岛内没有海,求岛的周长 [[0,1,0,0] ...
- Leetcode-463 Island Perimeter
#463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...
- LeetCode Island Perimeter
原题链接在这里:https://leetcode.com/problems/island-perimeter/ 题目: You are given a map in form of a two-dim ...
- sicily1024 Magic Island(图的遍历)
Description There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. ...
- codeforce B Island Puzzle
B. Island Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 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 ...
- [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 ...
随机推荐
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- 41、Aspera下载安装运用
参考:http://www.so.com/linkm=aLVHG%2FgJT4HyuVeK4%2BxX2LMFvF6oTiTCaruHE20pwjRia7DmVI2hIVfmw%2BFNPczCtvX ...
- 通过event事件来控制红绿灯通行车辆
事件的初始值为False,所以最开始就是红灯,先模拟红绿灯的规律,设定为每两秒变换一次灯,然后再模拟车辆通行,通过事件来将两者的事件结合起来, 当事件为False时,为红灯,车辆处于等待状态,一直wa ...
- eclipse——Maven插件创建java工程
目录结构如下 注意默认JDK为1.5 更改默认JDK 方式一 右键工程 选中JRE1.5 Remove 双击JRE System Library 点击Finish 更改完成 方式二 配置maven ...
- wgs84坐标系与gcj02坐标系转换误差分布图 | Mapping the Error in Transformation between WGS84 and GCJ02 Coordinations
国际上通用的是wgs84坐标系,而我国对于境内的坐标进行了加密,采用了gcj02坐标系,或者称为火星坐标系.亢孟军老师带的一门课<多媒体电子地图设计>要求我们从wgs84坐标系转换为gcj ...
- Android 中menu在activity中的使用
1.在res下选择new 选择Android resource directory 2.在弹出框中Resource type选择menu 3.在res下就可以看到menu文件夹 4.在menu文件夹 ...
- python 爬虫proxy,BeautifulSoup+requests+mysql 爬取样例
实现思路: 由于反扒机制,所以需要做代理切换,去爬取,内容通过BeautifulSoup去解析,最后入mysql库 1.在西刺免费代理网获取代理ip,并自我检测是否可用 2.根据获取的可用代理ip去发 ...
- C#设计模式系列:适配器模式(Adapter Pattern)
一.引言 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用.但是新环境要求的接口是这些现存对象所不满足的.如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同 ...
- rsync服务搭建--2018.5.8 [优化后最终版]
2018年5月8日 22:09:38 第一步配置基础环境(按照自己的规划配置并非每人的环境都一致) 第一台服务器(RSYNC服务器): rsync外网地址:10.0.0.41 rsync内网地址:1 ...
- 「TJOI2015」线性代数
题目链接 戳我 \(Describe\) 题目描述 为了提高智商,\(ZJY\)开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个\(n×n\)的矩阵\(B\)和一个\(1×n\)的矩阵\ ...