P2877 [USACO07JAN]牛校Cow School

01分数规划是啥(转)

决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题

怎么证明?可以暴力打表

我们用$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分数规划+决策单调性分治)的更多相关文章

  1. P2877 [USACO07JAN]牛校Cow School

    传送门 $01$规划 $01$规划优质讲解:传送门 考虑先将每一科按 $t/p$ 从小到大排序,枚举每一个 $D$(删除的考试数量) 显然一开始的成绩是 $\frac{\sum_{i=d+1}^nt[ ...

  2. 牛客多校5 A-gpa(01分数规划)

    gpa 链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  3. 2018年东北农业大学春季校赛 I wyh的物品【01分数规划/二分】

    链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...

  4. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  5. 【转】[Algorithm]01分数规划

    因为搜索关于CFRound277.5E题的题解时发现了这篇文章,很多地方都有值得借鉴的东西,因此转了过来 原文:http://www.cnblogs.com/perseawe/archive/2012 ...

  6. BZOJ5281: [Usaco2018 Open]Talent Show 01分数规划+01背包

    Description FarmerJohn要带着他的N头奶牛,方便起见编号为1…N,到农业展览会上去,参加每年的达牛秀!他的第i头奶牛重 量为wi,才艺水平为ti,两者都是整数.在到达时,Farme ...

  7. BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 166  Solved: 124[S ...

  8. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  9. BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】

    题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...

随机推荐

  1. elasticsearch 6.1.1 transport jar

    https://files.cnblogs.com/files/xjyggd/transport6.1.1.rar

  2. MYSQL 内存模型

  3. Jmeter中使用SSH插件,连接远程linux机器执行命令

    一.Why 在云主机测试中,需要使用SSH协议连接云主机进行相关操作 在python中使用paramiko库很好实现,在如果要使用jmeter做性能测试时,怎么做? 二.解决 既然原生jmeter没有 ...

  4. linux Ubuntu系统安装百度aip

    1.下载百度api pip install baidu-aip 2.配置视频转码工具ffmpeg Ubuntu16.04下安装FFmpeg(超简单版) 第一步:添加源. sudo add-apt-re ...

  5. 使用redis接管session

    class RedisSession { // 默认配置名称(使用load_config加载) private $_default_config_path = 'package/cache/redis ...

  6. 自闭的D7

    先是一道**题然后我死了啊. A: 哇人人都会我不会系列. 我们可以运用逆向思维啊,把它转化成若干个人从点1进来, 然后我们考虑深度 dep,用 num[dep] 表示深度大于等于这个点的有多少个, ...

  7. 一次CTF后对二维码的认识

    前一段时间参加一个CTF比赛的时候其中有一个题目就是一张二维码图片,然后获取其中的信息来解题,那个二维码的特别之处在于,它把3个位置探测区域用几张美女图片代替了,然后在做题的时候顺便简单的了解了一下二 ...

  8. phpStudy apache 启动不了

    做  phpstudy 环境配置的时候,apache 一直启动不了,启动后又停止,80 端口也没有被占用,也下载了 vc9  运行库,还是不行,后来找了半天,中文路径的问题

  9. less的安装与用法

    1. node.js node.js是一个前端的框架 自带一个包管理工具npm node.js 的安装 官网:http://nodejs.cn/ 在命令行检验是否安装成功 打开cmd 切换到项目目录, ...

  10. 浅谈Observer在代码中表现形式

    说到观察者模式,基本在软件工程领域中是应用广泛,不知道的可以先学习一番,下面给个快速的回顾,然后在通过一个grpc中的responseObserver谈下观察者对象在代码中的位置. 喜欢类图,就不上其 ...