BZOJ4426 :最大生产率(贪心+决策单调性DP)
题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和。N<1000
思路: 把包含至少一个其他的分到A组;否则到B组。
A组的要么单独分到一组,要么和它包含的某一个在一组(可以反证,假设已经分好组了,现在把不是单独分组的A加进去,如果分到不是包含关系的里面去,只会把答案变小)。
分组可以用栈进行。 而不是N^2枚举,因为多个相同的时候我们可以要保留一个作为最小的一个分到B组。
然后,现在A里面的没有包含关系了,我们可以排序,排序后一定是相邻的分到同一组,这里DP即可。
枚举单独分组的A,加上dp[][]跟新最大值即可。
原题是N<200的,我们可以用O(N^3)的DP来做。BZOJ上的N是1000的,我们需要优化,这种相邻分组的,估计要四边形不等式优化。果然是有决策单调性的,我们可以用分治来优化。 分P组,我们就P次分治。 然而我wa了N多次,因为我把不合法的部分continue了,事实上,不合法的也要更新,这样的mid才是ok的,不然单调性会出问题。
#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=b;i>=a;i--)
using namespace std;
const int maxn=;
const int inf=;
pii a[maxn];int tot,cnt,ans=-inf;
int vis[maxn],dp[maxn][maxn],len[maxn],mp[maxn][maxn];
void solve(int p,int L,int R,int l,int r)
{
if(L>R) return ;
int Mid=(L+R)>>,res=-inf,pos=l;
rep2(i,l,min(r,Mid-)){
if(mp[i+][Mid]>&&dp[i][p-]+mp[i+][Mid]>res) {
res=dp[i][p-]+mp[i+][Mid]; pos=i;
}
}
dp[Mid][p]=res;
solve(p,L,Mid-,l,pos);
solve(p,Mid+,R,pos,r);
}
int main()
{
int N,P;
scanf("%d%d",&N,&P);
rep(i,,N) scanf("%d%d",&a[i].first,&a[i].second);
sort(a+,a+N+);
rep(i,,N)
rep(j,i+,N)
if(a[i].second>=a[j].second){ vis[i]=; break;}
rep(i,,N)
if(vis[i]) len[++tot]=a[i].second-a[i].first;
else a[++cnt]=a[i];
sort(len+,len+tot+); reverse(len+,len+tot+);
rep(i,,tot) len[i]+=len[i-]; rep(i,,cnt){
int Mx=a[i].second,Mn=a[i].first;
rep(j,i,cnt){
Mx=min(Mx,a[j].second),Mn=max(Mn,a[j].first);
mp[i][j]=Mx-Mn;
}
} rep(i,,cnt) rep(j,,P) dp[i][j]=-inf;
dp[][]=;
rep(i,,min(P,cnt))
solve(i,i,cnt,,cnt-); rep(i,max(P-cnt,),tot){
if(dp[cnt][P-i]>)
ans=max(ans,len[i]+dp[cnt][P-i]);
} printf("%d\n",ans);
return ;
}
BZOJ4426 :最大生产率(贪心+决策单调性DP)的更多相关文章
- luogu P1721 [NOI2016]国王饮水记 斜率优化dp 贪心 决策单调性
LINK:国王饮水记 看起来很不可做的样子. 但实际上还是需要先考虑贪心. 当k==1的时候 只有一次操作机会.显然可以把那些比第一个位置小的都给扔掉. 然后可以得知剩下序列中的最大值一定会被选择. ...
- CF321E Ciel and Gondolas 【决策单调性dp】
题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...
- BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】
题目链接 BZOJ2216 题解 学过高中数学都应知道,我们要求\(p\)的极值,参变分离为 \[h_j + sqrt{|i - j|} - h_i \le p\] 实际上就是求\(h_j + sqr ...
- 洛谷 P3515 [ POI 2011 ] Lightning Conductor —— 决策单调性DP
题目:https://www.luogu.org/problemnew/show/P3515 决策单调性... 参考TJ:https://www.cnblogs.com/CQzhangyu/p/725 ...
- LOJ2074/2157 JSOI2016/POI2011 Lightning Conductor 决策单调性DP
传送门 我们相当于要求出\(f_i = \max\limits_{j=1}^{n} (a_j + \sqrt{|i-j|})\).这个绝对值太烦人了,考虑对于\(i>j\)和\(i<j\) ...
- Wannafly Camp 2020 Day 3F 社团管理 - 决策单调性dp,整体二分
有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方 ...
- BZOJ1563:[NOI2009]诗人小G(决策单调性DP)
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
- 【bzoj4709】[Jsoi2011]柠檬 决策单调性+dp
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从 ...
- bzoj 2216: [Poi2011]Lightning Conductor【决策单调性dp+分治】
参考:https://blog.csdn.net/clove_unique/article/details/57405845 死活不过样例看了题解才发现要用double.... \[ a_j \leq ...
随机推荐
- vsftp的安装与配置
1.安装 直接使用yum安装,如果没有网络在其他机器使用yum先离线下载即可,vsftpd一般就自己不需要装其他依赖包 rpm -qa|grep vsftpd #查看是否安装 yum install ...
- TinyXML C++解析XML
TinyXML 1.0可以参照上面的说明,获取一些概念. 转:http://blog.csdn.net/L_Andy/article/details/40615517 TinyXML 2.0 可以参照 ...
- I/O复用(select)——回声服务器端/客户端
一.select 使用select函数可以将多个文件描述符集中到一起统一监视,监视事件如下: 是否存在待读取数据. 是否可传输无阻塞传输数据. 是否发生异常. 将关心上述3种事件的文件描述发分别注册到 ...
- 快递小哥逆袭自传:用了6年时间做到了IT部门主管
在我30岁生日那天,终于收到升职的通知,自己如愿的也从一名小小程序员升职成为IT主管,负责公司硬件设备驱动程序开发项目,工资也从原来月薪10K变到现在月薪20K.或许对于很多人而言,在三十岁的时候,可 ...
- Java使用POI插件将数据以excel形式备份
将数据以表格形式进行备份 (1)导入poi的jar包 放入lib下: WebRoot\WEB-INF\lib\poi-3.2-FINAL-20081019.jar 下载链接:https://gith ...
- yaw roll pitch matrix
http://planning.cs.uiuc.edu/node102.html http://planning.cs.uiuc.edu/node103.html
- 深入理解java虚拟机---垃圾回收(十一)
1.垃圾回收要解决的问题 可以通过配置虚拟机参数来打印出内存日志: -verbose:gc -XX:+PrintGCDetails 垃圾收集(Garbage Collection,GC),要设计一个G ...
- Linux如何从零开始搭建rsync+serync服务器(centOS6)
一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增加.删除 ...
- Async注解的使用,异步进行代码解耦
在开发中进行代码性能的优化方式有很多种,如下单后,要发送消息推送给用户,此时可以使用消息中间件rabbitMq,或者使用异步的方式进行解耦 异步和同步的区别:比如做家务有:做饭,洗衣服,扫地,对于同步 ...
- python中的import,reload,以及__import__
python中的import,reload,以及__import__ 分类: UNIX/LINUX C/C++LINUX/UNIX shellpython2013-04-24 20:294536人阅读 ...