问题描述

苟先生的狼狗大军没有追上富先生, 所以他把它们都解雇了, 决定去雇佣一些更好的狗, 不过狗可是很贵的。苟先生有 \(w\) 元钱, 有 \(n\) 条狗可以雇佣, 第 \(i\) 条狗有一个能力值 \(q_i\)和一个需求 \(s_i\), 也就是说给它的钱不能少于 \(s_i\)。 对于两条狗 \(i\) 和 \(j\),给它们的钱的比值必须等于 \(q_i/q_j\)(当然钱可以不为整数) 。 苟先生希望雇佣到尽量多的狗, 并花尽量少的钱。

输入格式

第一行两个整数 \(n\) 和 \(w\)。

接下来 \(n\) 行每行两个整数 \(s_i\) 和 \(q_i\)。

输出格式

第一行一个整数 \(m\) 表示雇佣的数量, 接下来 \(m\) 行每行一个整数表

示雇佣的编号, 可以任意输出一组合法的解。

数据范围与约定

对于 50%的数据 \(n<=5000\);

对于 100%的数据 \(n<=100000,w<=10^{10},s_i,q_i<=20000\)。


首先吐糟数据,100%的数据只有50分,事实上是5e5

因为判最小钱判错了,而且掉到可持久化坑里,坚定的认为这个题可持久化才能输出方案,所以只有10pts

从一堆奇奇怪怪的东西里找到正解可以说是很不容易了,旁边的ouuanjulao几秒就出正解了

按\(\frac{s_i}{q_i}\)从小到大排序,我们发现如果以最低价选了某个位置\(i\)的东西,那么它左边的选择都可以唯一确定了,总花费是\(s_i \times \frac{\sum_{j=1}^i p_j}{p_i}\)

贪心的选,我们先选\(p\)小的就行了

可以用堆维护统计。。我没想到用的平衡树。。

保证钱最小 不等于 保证\(\sum_{j=1}^i p_j\)最小...


Code:

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <ctime>
#define ls ch[now][0]
#define rs ch[now][1]
using namespace std;
const int N=5e5+10;
int n;
double w;
struct node
{
double s,q;
int num;
bool friend operator <(node n1,node n2)
{
return n1.s/n1.q<n2.s/n2.q;
}
}dog[N];
double dat[N],sum[N];
int ch[N][2],siz[N],num[N],val[N],tot,root;
void updata(int now)
{
siz[now]=siz[ls]+siz[rs]+1;
sum[now]=sum[ls]+sum[rs]+dat[now];
}
void split(int now,double k,int &x,int &y)
{
if(!now) {x=y=0;return;}
if(k>=dat[now])
x=now,split(rs,k,rs,y);
else
y=now,split(ls,k,x,ls);
updata(now);
}
void split1(int now,double k,int &x,int &y)
{
if(!now) {x=y=0;return;}
if(k>=sum[ls]+dat[now])
x=now,split1(rs,k-sum[ls]-dat[now],rs,y);
else
y=now,split1(ls,k,x,ls);
updata(now);
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(val[x]<val[y])
{
ch[x][1]=Merge(ch[x][1],y);
updata(x);
return x;
}
else
{
ch[y][0]=Merge(x,ch[y][0]);
updata(y);
return y;
}
}
int New(double k,int id)
{
num[++tot]=id,sum[tot]=dat[tot]=k,siz[tot]=1,val[tot]=rand();
return tot;
}
void Insert(double k,int id)
{
int x,y;
split(root,k,x,y);
root=Merge(x,Merge(New(k,id),y));
}
int cnt,cnt0,ans[N],Ans;double cost;
void dfs(int now)
{
ans[++cnt0]=num[now];
if(ls) dfs(ls);
if(rs) dfs(rs);
}
void query(double q,double s,int id)
{
int x,y;
double k=w*q/s;
split1(root,k,x,y);
if(cnt<siz[x])
{
cost=sum[x]*s/q;
cnt=siz[x];
Ans=id;
//dfs(x);
}
if(cnt==siz[x]&&sum[x]*s/q<cost)
{
cost=sum[x]*s/q;
Ans=id;
//dfs(x);
}
root=Merge(x,y);
}
int main()
{
srand(time(0));
freopen("gui.in","r",stdin);
freopen("gui.out","w",stdout);
scanf("%d%lf",&n,&w);
cost=w;
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&dog[i].s,&dog[i].q);
dog[i].num=i;
}
sort(dog+1,dog+1+n);
for(int i=1;i<=n;i++)
{
Insert(dog[i].q,dog[i].num);
query(dog[i].q,dog[i].s,i);
}
memset(ch,0,sizeof(ch));
root=tot=0;
for(int i=1;i<=Ans;i++)
Insert(dog[i].q,dog[i].num);
int x,y;
split1(root,w*dog[Ans].q/dog[Ans].s,x,y);
dfs(x);
printf("%d\n",cnt);
sort(ans+1,ans+1+cnt);
for(int i=1;i<=cnt;i++)
printf("%d\n",ans[i]);
return 0;
}

2018.8.21

安徽师大附中%你赛day9 T3 贵 解题报告的更多相关文章

  1. 安徽师大附中%你赛day9 T2 富 解题报告

    富 题目背景 出于某些原因, 苟先生在追杀富先生. 题目描述 富先生所在的地方是一个\(n\times m\)的网格,苟先生排出了他的狼狗大军,共有\(k\)条狗,第\(i\)条狗所在的位置为\((x ...

  2. 安徽师大附中%你赛day7 T2 乘积 解题报告

    乘积 题目背景 \(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数. 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\).\(7\) ...

  3. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告

    [POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...

  4. 安徽师大附中%你赛day5 T3 树上行走 解题报告

    树上行走 题目背景 \(\mathrm{Smart}\) 的脑洞非常大, 经常幻想出一些奇怪的东西. 题目描述 某一天,\(\mathrm{Smart}\) 幻想出了一棵没有边际的二叉树,脑补着在那棵 ...

  5. 安徽师大附中%你赛day3T1 怜香惜玉 解题报告

    怜香惜玉 题意: 已知 \(f(x)=\frac{2 \times \sum_{(i,x)=1}^x i}{φ(x)}\) 先给定数据组数\(t\)和\(k\) 每组数据给出\(n\),求\(\sum ...

  6. 安徽师大附中%你赛day2T3 巧克力 解题报告

    巧克力 题目描述 小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) .现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是 ...

  7. 安徽师大附中%你赛day4T2 演讲解题报告

    演讲 题目背景: 众所周知,\(\mathrm{Zdrcl}\)是一名天天\(\mathrm{AK}\)的高水平选手. 作为一民长者,为了向大家讲述自己\(\mathrm{AK}\)的经验,他决定在一 ...

  8. 安徽师大附中%你赛day4T1 金字塔 解题报告

    金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...

  9. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

随机推荐

  1. Angular2中使用Jsonp

    除了引入HttpModule模块,还要引入 JsonpModule 模块 import { HttpModule, JsonpModule } from '@angular/http'; Observ ...

  2. HTTP学习之HTTP基础

    学习HTTP技术,首先要了解它的在web通信中有哪些特点,起到什么作用.有哪些规范.都有什么功能. HTTP的特点 HTTP使用的是一种可靠的.快速响应的数据传输协议,用户一旦发起请求,Web服务器可 ...

  3. C语言常用关键语法精华总结

    1.关于typedef的用法总结 2.typedef struct的用法 3.typedef函数指针用法 4.数组指针(数组类型的指针)与指针数组 5.真正明白c语言二级指针 6.C语言for循环(及 ...

  4. 第三章 最简单的C程序设计——顺序程序设计

    一.数据的表现形式及其运算 1.常量和变量 在计算机高级语言中,数据有两种表现形式:常量和变量. 1.1.常量 在程序运行过程中,其值不能被改变的量称为常量.如:5,6,32,0.111. 数值常量就 ...

  5. JAVA 反射之Method

    ★ Method没有构造器,只能通过Class获取. 重点方法: class.getDeclaredMethods():获取所有方法. class.getDeclaredMethod(String n ...

  6. (译)JavaScript 中的正则表达式(RegEx)实操——快速掌握正则表达式,伴有随手可练的例子————(翻译未完待续)

    (原文:https://blog.bitsrc.io/a-beginners-guide-to-regular-expressions-regex-in-javascript-9c58feb27eb4 ...

  7. web开发微信文章目录

    Web开发微信文章目录 2015-12-13 Web开发 本文是Web开发微信的文章目录.通过目录查看文章编号,回复文章编号就能查看文章全文. 回复编号查看全文,搜索分类名可以获得该分类下的文章.   ...

  8. 网页设计简史看设计&代码“隔膜”

    本文来自网易云社区 作者:马宝 设计与代码之间隔膜所在?既然你诚心诚意地问了,我就大发慈悲地告诉你.为了防止地球被破坏,为了维护世界的和平,为了贯彻爱与真实的邪恶~,我是穿梭在前端与设计之间爱与美丽的 ...

  9. nginx 负载均衡 反向代理

    nginx 通过方向代理实现负载均衡,负载均衡是大流量网站要做的措施,单从字面上的意思来理解为N台服务器平均分担负载,不会因为某一台服务器负载高宕机而影响用户访问网站,负载均衡至少需要三台服务器, 既 ...

  10. n个台阶,每次都可以走一步,走两步,走三步,走到顶部一共有多少种可能

    分析 第一个台阶  1第二个台阶  11 2    //走两次1步或者走1次两步第三个台阶  111 12 21 3 第四个台阶  1111 112 121 211 22 13 31 思想:4阶台阶, ...