P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School
决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题
怎么证明?可以暴力打表
我们用$ask(l,r,dl,dr)$表示处理区间$[l,r]$时,这段区间的决策点已固定在$[dl,dr]$中
设$mid=(l+r)/2$,暴力处理$mid$的最优决策点$dm$
再向下分治$ask(l,mid-1,dl,dm)$,$ask(mid+1,r,dm,dr)$
对于本题,先按$t[i]/p[i]$从大到小排序,排序后的默认方案(删掉后D个)即为
取区间$[1,n-D]$,舍去区间$[n-D+1,D]$
怎么判断默认方案是否最优呢
根据01分数规划的基本套路(大雾)
设$r=st[i]/sp[i]$($st[i],sp[i]$为排序后$t,p$的前缀和)
在$[1,n-D]$中找到$A=min{t[i]-r*p[i]}$
在$[n-D+1,n]$中找到$B=max{t[i]-r*p[i]}$
如果$A<B$,那么交换A,B可以使答案更优,即默认方案不是最佳方案
于是就可以分治处理辣
复杂度$O(nlogn)$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define N 50005
struct data{ll t,p;}a[N];
int n,ans; ll f[N],g[N],st[N],sp[N];
inline bool cmp(data A,data B){return A.t*B.p>A.p*B.t;}
void getf(int l,int r,int dl,int dr){
int mid=(l+r)>>,dm;
f[mid]=1e16;
for(int i=dl;i<=min(mid,dr);++i){
ll tt=sp[mid]*a[i].t-st[mid]*a[i].p;
if(tt<f[mid]) f[mid]=tt,dm=i;
}
if(l<mid) getf(l,mid-,dl,dm);
if(r>mid) getf(mid+,r,dm,dr);
}
void getg(int l,int r,int dl,int dr){
int mid=(l+r)>>,dm;
g[mid]=-1e16;
for(int i=dr;i>=max(mid+,dl);--i){
ll tt=sp[mid]*a[i].t-st[mid]*a[i].p;
if(tt>g[mid]) g[mid]=tt,dm=i;
}
if(l<mid) getg(l,mid-,dl,dm);
if(r>mid) getg(mid+,r,dm,dr);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%lld%lld",&a[i].t,&a[i].p);
sort(a+,a+n+,cmp);
for(int i=;i<=n;++i) st[i]=a[i].t+st[i-],sp[i]=a[i].p+sp[i-];
getf(,n-,,n); getg(,n-,,n);
for(int i=;i<n;++i) if(f[i]<g[i]) ++ans;
printf("%d\n",ans);
for(int i=n-;i;--i) if(f[i]<g[i]) printf("%d\n",n-i);
return ;
}
P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)的更多相关文章
- P2877 [USACO07JAN]牛校Cow School
传送门 $01$规划 $01$规划优质讲解:传送门 考虑先将每一科按 $t/p$ 从小到大排序,枚举每一个 $D$(删除的考试数量) 显然一开始的成绩是 $\frac{\sum_{i=d+1}^nt[ ...
- 牛客多校5 A-gpa(01分数规划)
gpa 链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- 2018年东北农业大学春季校赛 I wyh的物品【01分数规划/二分】
链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...
- POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9703 Accepted: 3299 ...
- 【转】[Algorithm]01分数规划
因为搜索关于CFRound277.5E题的题解时发现了这篇文章,很多地方都有值得借鉴的东西,因此转了过来 原文:http://www.cnblogs.com/perseawe/archive/2012 ...
- BZOJ5281: [Usaco2018 Open]Talent Show 01分数规划+01背包
Description FarmerJohn要带着他的N头奶牛,方便起见编号为1…N,到农业展览会上去,参加每年的达牛秀!他的第i头奶牛重 量为wi,才艺水平为ti,两者都是整数.在到达时,Farme ...
- BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 166 Solved: 124[S ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】
题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...
随机推荐
- pom.xml文件最详细的讲解
1 引入额外的jar包 <dependency> <groupId>bitwalker</groupId> <artifactId>UserAgentU ...
- 程序中的@Override是什么意思?
@Override是Java5的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记 @Override是伪代码,表示重写( ...
- ASP.NET MVC实现Excel文件的上传下载
在应用系统开发当中,文件的上传和下载是非常普遍的需求.在基于.NET的C/S架构的项目开发当中,有多种方案可以实现文件的上传和下载(httpwebrequest.webclient等),而且多采用异步 ...
- [LeetCode] Basic Calculator IV 基本计算器之四
Given an expression such as expression = "e + 8 - a + 5" and an evaluation map such as {&q ...
- 在node环境使用axios发送文件
yarn add form-data (async () => { const l = console.log; const axios = require("axios") ...
- hibernate--博客
地址:http://blog.csdn.net/wangpeng047/article/category/907051
- git 实战
1.网站手动创建新分支 2.在master下 项目路径下 右键 Git branch here 3.切分支: git fetch git branch -a git branch -r git che ...
- hash 位运算 练习
hash 位运算 [以下代码仅做位运算的练习,算法本身不合理 php转译python] 从头到尾彻底解析Hash表算法_知识库_博客园 https://kb.cnblogs.com/page/18 ...
- 复习C++:VS2008中的宏干嘛用的
VS2008中有宏,可也进行编辑和设置. 好处: 1.快速生成代码,帮助开发. 2.个人定制化功能,IDE更合适自己用. 3.提升编程效率. 缺点: 使用VB开发,一开始用起来费事.不过有官方参考 ...
- 洛谷P3178 树上操作 [HAOI2015] 树链剖分
正解:树链剖分+线段树 解题报告: 传送门! 树链剖分+线段树算是基操了趴,,, 就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽 比树剖的板子还要板子一些hhhhh 放下代码就 ...