题目链接:[USACO07JAN]Cow School

一开始还以为是一道分数规划,后来发现自己看错题了,

然后成功入坑

题目是要求先按照$t_i/p_i$从小到大排序,然后删除前$d$个后求出剩下的$\frac{\sum^{n-d+1}_{i=1}t_i}{\sum^{n-d+1}_{i=1}p_i}$,如果当前的删除方法不是最优的(即能删除其它$d$个数使原式的值变大的话),则输出这个$d$

首先排序自不必说,排完序之后基础的式子的值也就求出来了

那么问题就在于如何判断当前的删除方法是不是最优的

为了方便我们将数据从大到小排序

我们假设当前取了前$k$个最大的

并设$T=t_1+t_2+\cdots+t_k,P=p_1+p_2+\cdots+p_k$

那么题目就是求是否存在$i,j$,满足$\frac{T-t_i+t_j}{P-p_i+p_j}>\frac{T}{P}$(其中$i\in \lbrace1,2,\cdots,k \rbrace,j\notin \lbrace1,2,\cdots,k \rbrace$)

将式子变形得$P*t_i-T*p_i<P*t_j-T*t_i$

所以我们只要找出$P*t_i-T*p_i$的$min$,以及$P*t_j-T*p_j$的$max$

这时我们再来算一算时间复杂度

我们在枚举前$k$个最大的数时需要$O(n)$的时间,

因此我们在处理最大值与最小值时只能用$O(logn)$的时间复杂度

但由于我们的$与T_i与P_i$是已经排好序的,所以我们可以用二分来处理这个最大值与最小值

感觉洛谷上这题给黑题是不是太高看了(逃

 #include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const long long inf=(long long)1e18;
struct node{
long long t,p;
}a[],b[];
int n,ans[];
long long mind[],maxd[]; bool cmp(node x,node y)
{
return x.t*y.p>x.p*y.t;
} void getmin(int l,int r,int pl,int pr)
{
int i,mid=(l+r)>>,pos;
for (i=pl;i<=mid&&i<=pr;i++)
{
long long tmp=a[i].t*b[mid].p-a[i].p*b[mid].t;
if (tmp<mind[mid]) {mind[mid]=tmp;pos=i;}
}
if (l<mid) getmin(l,mid-,pl,pos);
if (r>mid) getmin(mid+,r,pos,pr);
} void getmax(int l,int r,int pl,int pr)
{
int i,pos,mid=(l+r)>>;
for (i=pr;i>mid&&i>=pl;i--)
{
long long tmp=a[i].t*b[mid].p-a[i].p*b[mid].t;
if (tmp>maxd[mid]) {maxd[mid]=tmp;pos=i;}
}
if (l<mid) getmax(l,mid-,pl,pos);
if (r>mid) getmax(mid+,r,pos,pr);
} int main()
{
scanf("%d",&n);
int i;
for (i=;i<=n;i++) scanf("%lld%lld",&a[i].t,&a[i].p);
sort(a+,a++n,cmp);
b[].t=;b[].p=;
for (i=;i<=n;i++)
{
b[i].t=b[i-].t+a[i].t;
b[i].p=b[i-].p+a[i].p;
}
for (i=;i<=n;i++) {mind[i]=inf;maxd[i]=-inf;}
getmin(,n-,,n);getmax(,n-,,n);
int pos=;
for (i=;i<n;i++) if (mind[i]<maxd[i]) ans[++pos]=n-i;
printf("%d\n",pos);
for (i=pos;i>=;i--) printf("%d\n",ans[i]);
return ;
}

[USACO07JAN]Cow School的更多相关文章

  1. P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)

    P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...

  2. bzoj1635 / P2879 [USACO07JAN]区间统计Tallest Cow

    P2879 [USACO07JAN]区间统计Tallest Cow 差分 对于每个限制$(l,r)$,我们建立一个差分数组$a[i]$ 使$a[l+1]--,a[r]++$,表示$(l,r)$区间内的 ...

  3. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow

    To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. ...

  4. [Luogu2879][USACO07JAN]区间统计Tallest Cow

    题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a p ...

  5. P2877 [USACO07JAN]牛校Cow School

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

  6. 洛谷 P2879 [USACO07JAN]区间统计Tallest Cow

    传送门 题目大意: n头牛,其中最高身高为h,给出r对关系(x,y) 表示x能看到y,当且仅当y>=x并且x和y中间的牛都比 他们矮的时候,求每头牛的最高身高. 题解:贪心+差分 将每头牛一开始 ...

  7. 题解 P2879 【[USACO07JAN]区间统计Tallest Cow】

    题目链接: https://www.luogu.org/problemnew/show/P2879 思路: 先不管最大高度,我们读入一对x,y.说明,x+1~y-1之间牛的身高都小于x,y. 然后不妨 ...

  8. [USACO07JAN]区间统计Tallest Cow

    前缀和 sum[i]表示前i个数的和 每次读入a[i]的时候 sum[i] = sum[i - 1] + a[i]; 查询l ~ r区间的和: sum[r] - sum[l - 1] 差分 即前缀和的 ...

  9. 【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)

    题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...

随机推荐

  1. ECS上配置FTP Filezilla

    又来搞华为ECS 第一,服务器安装服务端 第二,设置被动模式,把服务器的公网IP填好 第三,生成一个服务器证书,客户端连接时接受 第四,设置自定义的被动连接端口比如 9000-9050 第五,去ECS ...

  2. 关于jsp中jstl-core标签循环遍历的使用

    JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...

  3. 论学习IT的基本学习方法

    学习还是要通过实践总结这种方式去不断进步,当然这个思想对于生活中的任何事都是相通的,就像我现在做的就是总结一下自己的学习方法,更多的是针对于IT代码这块知识的总结. 我想通过这种博客总结的方式来不断总 ...

  4. [2017BUAA软工助教]团队开发阶段CheckList

    alpha阶段流程与相关节点 以下流程与团队项目中个人的得分点是一一对应的,详见QA文档中"个人在团队项目的得分部分" http://www.cnblogs.com/Childis ...

  5. windows下使用cmake编译zlib与libpng libjpeg

    win7下使用VS2010编译jpeglib 1.下载源代码下载地址:http://www.ijg.org/files/,     选择最新版本的windows版本压缩包,进行下载.     jpeg ...

  6. Linux下面将windows写的脚本转换成 Linux 格式的文件

    1.接着上一篇blog 发现有一个问题 vim 打开文件 发现最下面有一行信息: 2. 里面有一些 不一样的地方. linux里面没法执行 ,如果想执行的话 可以输入命令 :set fileforma ...

  7. 使用cmd命令删除文件夹下所有文件

    rmdir 删除整个目录 好比说我要删除 222 这个目录下的所有目录和档案,这语法就是: rmdir /s/q 222 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目 ...

  8. 使用Elasticsearch 出现的拒绝连接

    pom 文件 spring: elasticsearch: jest: uris: http://192.168.124.142:9201 # data: # elasticsearch: # clu ...

  9. Numpy中array数据操作

    1.创建: import numpy as np arr=np.array([1,2,3]) print(arr,arr.ndim) list=[1,2,3] arr=np.array(list) 2 ...

  10. java学习之—栈匹配字符串符号

    /** * 栈 * Create by Administrator * 2018/6/11 0011 * 上午 10:20 **/ public class StackR { private int ...