Bolshevik

题目链接

题目大意

有n(1e6)个人你是第m个人
第i个人有ai块钱,其中bi块钱在钱包里,如果偷了第i个人的钱,他的钱就会变为ai - bi
你是一个小偷,至少投多少个人的钱才能变成这n个人里最有钱的人(可以有人跟你一样有钱)

怎么做?

贪心。。
先按ai排序,为什么? 因为如果偷第二大ai的钱的话,最多的钱就会被第一大的限制住,所以偷钱偷的是一个前缀,然后按ai排序,O(n)枚举前缀,比如现在枚举到了第i个i+1~n得挑bi大的偷。现在只用找出来选取的前缀里最大的ai - bi和没选取的里面的最大的ai,最后要偷完的总钱得大于等于这两个的最大值。
前缀和很好弄,要找的最大值也很好弄,因为是按ai排序的,所以最大值是a[i + 1]。但是后面选取最大的b没法弄,于是就得有一个数据结构来维护,维护什么值? 看一下从第i - 1个变成第i个的变化:删除bi,查询取的bi的最少的个数x,答案就是i + x取最小值。设最大值是s前缀和是sum查询的就是最少多少个bi可以大于等于s - sum,,这个数据结构不就是权值线段树吗。。 这个1e9得离散化一下,,,,这里题解给的是在线段树上二分。。由于我不知道咋弄,所以就算了,。。
可能数据很水?

代码
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1e6+6;
typedef long long ll;
std::vector<ll> vv;
struct NO
{ll a,b;
}a[maxn];
bool cmp(NO a, NO b)
{return a.a > b.a;
}
struct Node
{int num;ll sum;
}node[maxn<<2];
int getid(ll x)
{return lower_bound(vv.begin(),vv.end(),x) - vv.begin() + 1;
}
void add(int l,int r,int no,int num,int f)
{node[no].sum += f * vv[num - 1];node[no].num += f;if(l == r)return;int mid = l + r>> 1;if(num <= mid)add(l,mid,no<<1,num,f);elseadd(mid + 1, r, no<<1|1,num,f);
}int query(int l,int r,int no,ll sum)
{if(l == r){ll num = vv[l - 1];int c = (sum + num - 1) / num;if(c > node[no].num)return -1;elsereturn c;}ll s = node[no<<1|1].sum;int x = node[no<<1|1].num;int mid = l + r >> 1;// printf("%lld %lld %d %d %d\n",s,sum,l,r,x);if(s >= sum){int y = query(mid + 1, r ,no<<1|1,sum);return y;}else{int y = query(l, mid,no<<1,sum - s);// printf("%d\n",y);if(y == -1)return -1;return x + y;}
}struct P
{int id;ll val;bool operator< (const P & a)const{return a.val > val;}
};
int main()
{int n,m;scanf("%d%d",&n,&m);ll x = 0;for (int i = 1; i <= n; i ++ ){scanf("%lld",&a[i].a);}for (int i =1; i <= n; i ++ ){scanf("%lld",&a[i].b);vv.push_back(a[i].b);}sort(vv.begin(),vv.end());vv.erase(unique(vv.begin(),vv.end()),vv.end());int k = vv.size();x = a[m].a;for (int i = m; i < n; i ++ )a[i] = a[i + 1];sort(a + 1,a + n,cmp);for (int i = 1; i < n; i ++ ){add(1,k,1,getid(a[i].b),1);}ll maxx =0 ;ll sum = x;int ans = -1;// printf("%lld %lld\n",sum,qq.top().val);if(sum < a[1].a){ans = query(1,k,1,a[1].a - sum);}elseans = 0;for (int i= 1; i < n; i ++ ){sum += a[i].b;maxx = max(maxx,a[i].a - a[i].b);add(1,k,1,getid(a[i].b),-1);// printf("1111111111111 %d %d\n",ans,i);ll s = a[i + 1].a;s = max(maxx,s);if(sum >= s){if(ans == -1)ans = i;elseans = min(ans,i);}else{s -= sum;int x = query(1,k,1,s);if(x == -1)continue;if(ans == -1)ans = x + i;elseans = min(ans,x + i);}}if(ans != -1){printf("%d\n",ans);}elseprintf("The Soviet Union is doomed\n");
}

洛谷多校补题 5 B相关推荐

  1. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  2. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  3. 洛谷 2220 [HAOI2012]容易题 题解(组合数学,离散化)

    原链接: 洛谷:点我QωQ bzoj:点我QωQ 题意简述 一个长度为mmm的数列aaa,每个数都在[1,n][1,n][1,n]之间,有kkk个限制.第iii个限制包含两个正整数x,yx,yx,y, ...

  4. 2019HDU多校补题

    心得:做不出,补不动 HUD第一场: 1001 Blank Y 1002 Operation Y 1003 Milk 1004 Vication Y 1005 Path Y 1006 Typewrit ...

  5. 2021杭电多校补题(3)

    1009题目链接 设 fijkf_{ijk}fijk​ 表示从 (1,1) 走到 (i,j),一路上收集了 k 个钻石时,钻石的单价最高能涨到多少,则 ans = max(k × f n,n,k ). ...

  6. HOJ 系统常用功能介绍 部署快速入门 c++ python java编程语言在线自动评测 信息奥赛一本通 USACO GESP 洛谷 蓝桥 CSP NOIP题库

    技术支持微 makytony 服务器配置需求 腾讯云 2H4G 5M 60GB 轻量应用服务器  承载大约 200~400人使用,经过压力测试,评测并发速度可满足130人左右的在线比赛. 系统镜像选 ...

  7. [题单]多校补题 2017-2012

    仅做初步了解并筛除了不大可能会解的题目 (一般都会咕的) hard表示榜单过题人数少于50或20(大概)的题目 ****2017**** 6034 贪心 6035 树形DP OO 6038 组合数学 ...

  8. 洛谷 能力提升综合题单Part1 入门阶段 P1089 津津的储蓄计划 带注释

    题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在 ...

  9. 2019暑期多校补题情况 hdu

    hdu: Ο 以补 .   未补 题号 A B C D E F G H I J K L 状态 . Ο . Ο Ο . . . . . . . 第一场: 现场: 1004:思路 1005:板子最短路+最 ...

最新文章

  1. mysql数据库使用
  2. sqlite-jdbc jar包下载过程笔记
  3. Java的Map遍历
  4. oracle 执行计划
  5. 浅谈双人游戏的设计与魅力——由《双人成行》引发的思考
  6. 网站大流量高并发访问的处理解决办法
  7. iOS-----------关于组件化
  8. 通向财务自由之路06_适应大环境的交易策略
  9. ASCII码表 0-255完整版 附详细注释
  10. python不同颜色的代码_python日志通过不同的等级打印不同的颜色(示例代码)
  11. 关于配置文件的节点内容加密(备忘)
  12. ecshop后台首页mysql_ecshop商城后台使用手册
  13. 复盘:企业微信中国发展简史
  14. dubbo服务出现大量超时问题
  15. 看了下华为工资,我不加班了
  16. java.lang.IllegalArgumentException: Unable to create converter for class xxxx
  17. galaxy s8 android pc,三星S8/S8+发布!全面屏、智能助理、秒变PC,苹果8已败
  18. 通过优化提高网站转化率
  19. Python绘制对多角星
  20. MySQL create database 新建utf-8/utf8mb4编码 数据库

热门文章

  1. C语言以菜单方式进入属于,2009“高职升本科”计算机试卷及参考答案
  2. Python读取txt文件,将xxx=111,yyy=222转换为json或字典格式
  3. CentOS系统实现SSH无密码登录的方法
  4. android9.0无法创建照片路径,Android9.0无法加载图片及访问不了服务器问题
  5. 火绒安全软件 5.0.59.0 官方版
  6. 1013. Battle Over Cities (25) 连通图
  7. java语言中定义的字节输出流_Java语言中的输入输出流包括字节流、字符流、文件流、对象流以及线程之间通信的管道流,【 】包中的类...
  8. 在Yaf中使用Zf2的配置和服务管理器
  9. linux shell学习一
  10. 电脑自动使用代理服务器导致无法上网