CF-1055E:Segments on the Line (二分&背包&DP优化)(nice problem)
You are a given a list of integers a 1 ,a 2 ,…,a n a1,a2,…,an and s s of its segments [l j ;r j ] [lj;rj] (where 1≤l j ≤r j ≤n 1≤lj≤rj≤n ).
You need to select exactly m m segments in such a way that the k k -th order statistic of the multiset of a i ai , where i i is contained in at least one segment, is the smallest possible. If it's impossible to select a set of m m segments in such a way that the multiset contains at least k k elements, print -1.
The k k -th order statistic of a multiset is the value of the k k -th element after sorting the multiset in non-descending order.
Input
The first line contains four integers n n , s s , m m and k k (1≤m≤s≤1500 1≤m≤s≤1500 , 1≤k≤n≤1500 1≤k≤n≤1500 ) — the size of the list, the number of segments, the number of segments to choose and the statistic number.
The second line contains n n integers a i ai (1≤a i ≤10 9 1≤ai≤109 ) — the values of the numbers in the list.
Each of the next s s lines contains two integers l i li and r i ri (1≤l i ≤r i ≤n 1≤li≤ri≤n ) — the endpoints of the segments.
It is possible that some segments coincide.
Output
Print exactly one integer — the smallest possible k k -th order statistic, or -1 if it's impossible to choose segments in a way that the multiset contains at least k k elements.
Examples
4 3 2 2
3 1 3 2
1 2
2 3
4 4
2
5 2 1 1
1 2 3 4 5
2 4
1 5
1
5 3 3 5
5 5 2 1 1
1 2
2 3
3 4
-1
题意:给定给N个点,以及M个线段,让你选择S个线段,使得至少被一个线段覆盖的点排序后,第K大最小,没有则输出-1。
思路:求第K大最小,显然需要二分,每次验证看当前的mid是否有大于等于K个数小于mid。验证我们用dp来验证,复杂度是O(NMS*lgN);
需要优化掉一个。这里用背包把M优化掉了,我们找到每个点的Next,Next代表包含这个点的最右端。就不难得到dp方程,这个时候M已经没用了。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
struct in{ int L,R;}s[maxn];
int a[maxn],b[maxn],N,S,M,K,sum[maxn];
int dp[maxn][maxn],Next[maxn];
bool check(int Mid) //M个选最多S个的第K大
{
rep(i,,N) sum[i]=sum[i-]+(a[i]<=Mid);
rep(i,,S) rep(j,,N) dp[i][j]=;
rep(i,,S){
rep(j,,N) dp[i][j]=max(dp[i][j],dp[i-][j]); //不选j位置。
rep(j,,N) if(Next[j]) dp[i][Next[j]]=max(dp[i][Next[j]],dp[i-][j-]+sum[Next[j]]-sum[j-]); //选j
rep(j,,N) dp[i][j]=max(dp[i][j],dp[i][j-]);
}
return dp[S][N]>=K;
}
int main()
{
scanf("%d%d%d%d",&N,&M,&S,&K);
rep(i,,N) scanf("%d",&a[i]),b[i]=a[i];
rep(i,,M) scanf("%d%d",&s[i].L,&s[i].R);
rep(i,,M) rep(j,s[i].L,s[i].R) Next[j]=max(Next[j],s[i].R);
sort(b+,b+N+); int L=,R=N,Mid,ans=-;
while(L<=R){
Mid=(L+R)>>;
if(check(b[Mid])) ans=b[Mid],R=Mid-;
else L=Mid+;
}
printf("%d\n",ans);
return ;
}
CF-1055E:Segments on the Line (二分&背包&DP优化)(nice problem)的更多相关文章
- BZOJ 1044 木棍分割(二分答案 + DP优化)
题目链接 木棍分割 1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3830 Solved: 1453[S ...
- HDU 1171 Big Event in HDU 多重背包二进制优化
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Jav ...
- hdu 5534 Partial Tree 背包DP
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...
- noj [1479] How many (01背包||DP||DFS)
http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...
- luogu 4377 Talent show 01分数规划+背包dp
01分数规划+背包dp 将分式下面的部分向右边挪过去,通过二分答案验证, 注意二分答案中如果验证的mid是int那么l=mid+1,r=mid-1,double类型中r=mid,l=mid; 背包dp ...
- bzoj5281/luogu4377 Talent Show (01分数规划+背包dp)
就是01分数规划的思路,只不过当把w[i]-r*t[i]>0的选完以后如果w值还没达到要求,那就再01背包dp一下就好了(dp时w值>W的时候就存在W里就不会爆内存了). (跑得很慢..大 ...
- POJ-2018 Best Cow Fences(二分加DP)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10174 Accepted: 3294 Desc ...
- HDU 3591 (完全背包+二进制优化的多重背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 M ...
随机推荐
- C#之父
来自为知笔记(Wiz)
- char *strstr(const char *str1, const char *str2);
[FROM MSDN && 百科] 原型:char *strstr(const char *str1, const char *str2); #include<string.h& ...
- king 选 太子
king 选 太子 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 啊,从前有一个国家.此国兵强马壮,但是国王却身体不好.于是就想挑一位太子出来: 但是问题来了,国王 ...
- Smarty 模板布局继承
Smarty 模板继承 在覆盖父模板的{block}块以外的地方, 子模板不能定义任何内容.任何在{block}以外的 内容都会被自动忽略. 在子模板和父模板中的{block}内容,可以通过 appe ...
- SQL case when 多条件查询
基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后.下面给个简单示例:
- source insight 4.0的基本使用方法(转)
源:source insight 4.0的基本使用方法 source insight 4设置
- Linux学习笔记之Linux计划任务Crontab
0x00 cron 简介 cron 是 UNIX, SOLARIS,LINUX 下的一个十分有用的工具.通过 cron 脚本能使计划任务定期地在系统后台自动运行. 0x01 cron 命令 cront ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...
- SpringBoot基础的使用
springboot的基础使用 和 内部原理 高级使用整合 进行web开发 springboot 看下spring的所有项目:https://spring.io/projects 等等 就不一一介绍了 ...
- 一个轻量级分布式 RPC 框架 — NettyRpc
原文出处: 阿凡卢 1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个 ...