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. 【数据库问题】sql server 获取MD5值结果不一致的问题 substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','111111')),11,32)

    获取 111111 的MD5值 SELECT substring(sys.fn_sqlvarbasetostr(HashBytes(,) 执行结果:965eb72c92a549dd5a330112 但 ...

  2. cpu选型

    就像手机有骁龙845和麒麟980等,电脑的cpu也有intel和amd,intel有台式机cpu, 网上搜索最具性价比神u:G4560,i3-8100, intel八代,包含奔腾G5600/G5500 ...

  3. Web 端自动化测试

    一.环境搭建 准备工具如下:下载 python[python 开发环境](http://python.org/getit/) 下载setuptools: [python 的基础包工具](http:// ...

  4. php验证18位身份证,准到必须输入正确的身份证号,

    /** * 验证18位身份证(计算方式在百度百科有) * @param string $id 身份证 * return boolean */ function check_identity($id=' ...

  5. 如何在vscode中调试python scrapy爬虫

    本文环境为 Win10 64bit+VS Code+Python3.6,步骤简单罗列下,此方法可以不用单独建一个Py入口来调用命令行 安装Python,从官网下载,过程略,这里主要注意将python目 ...

  6. mysql提权常用方法。 hack某某

    一般是root权限,知道mysql root权限,root账号密码 启动项提权:原理:利用高权限的root写入一个vbs脚本到启动项,再通过一些方法如ddos,社工管理员之类的方法来让服务器重启,运行 ...

  7. 线程同步-SpinWait

    这次将描述如何不适用内核模式的方式来使线程等待.SpinWait,它是一个混合同步构造,被设计为使用用户模式等待一段时间,然后切换到内核模式以节省CPU时间. 代码Demo: using System ...

  8. 【转】Windows下Python快速解决error: Unable to find vcvarsall.bat

    转自:http://blog.csdn.net/sad_sugar/article/details/73743863 系统配置:Windows10 x64, Visual Studio 2017, P ...

  9. springboot 2.0部署到Tomat8.5上

    1.改jar为war 2.改下打包的名字 3.删掉tomcat的webapps下面的所有文件夹.将打好的jar包放入到webapps下 4.运行tomcat,双击shutdown.bat 注意: sp ...

  10. [httpd] httpd server 在低负载的情况下对SYN无响应

    如题: 两台client通过load balance访问httpd server.两个client交互访问.load balance处于fullnat模式. server在低负载情况下,常常对某一个c ...