传送门

线段树好题。

这题一看我就想贪心。

先把a,b数组排序。

然后我们选择a数组中最大的b个数(不足b个就选a个数),分别贪心出在b数组中可以获得的最大贡献。

这时可以用线段树优化。

然后交上去只能过一个点(雾

调了很久都没有发现错误点。

于是搜题解。

发现大家的做法都跟我不一样233。

但我不能放弃。

就在这时我发现有可能每次贪心出的最大贡献可能是负数233。

于是我们把每次的决策都记下来。

最后枚举删去最小的决策(有可能是负数,这样答案会增加)之后的贡献来更新答案。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 100005
  3. #define ll long long
  4. #define lc (p<<1)
  5. #define rc (p<<1|1)
  6. #define mid (T[p].l+T[p].r>>1)
  7. using namespace std;
  8. inline ll read(){
  9. ll ans=0;
  10. char ch=getchar();
  11. while(!isdigit(ch))ch=getchar();
  12. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  13. return ans;
  14. }
  15. int n,m,top;
  16. bool vis[N];
  17. ll ans=0,sum=0,val[N],a[N],s1[N],s2[N];
  18. struct node{int v;ll w;}q[N];
  19. struct Node{int l,r;ll mx;}T[N<<2];
  20. inline bool cmp(node a,node b){return a.v<b.v;}
  21. inline ll max(ll a,ll b){return a>b?a:b;}
  22. inline void pushup(int p){T[p].mx=max(T[lc].mx,T[rc].mx);}
  23. inline void build(int p,int l,int r){
  24. T[p].l=l,T[p].r=r;
  25. if(l==r){T[p].mx=q[l].w;return;}
  26. build(lc,l,mid),build(rc,mid+1,r),pushup(p);
  27. }
  28. inline void update(int p,int k){
  29. if(T[p].l==T[p].r){T[p].mx=-0x3f3f3f3f;return;}
  30. if(k<=mid)update(lc,k);
  31. else update(rc,k);
  32. pushup(p);
  33. }
  34. inline int ask(int p){
  35. if(T[p].l==T[p].r)return T[p].l;
  36. if(T[lc].mx==T[p].mx)return ask(lc);
  37. return ask(rc);
  38. }
  39. inline int query(int p,int ql,int qr){
  40. if(ql<=T[p].l&&T[p].r<=qr)return ask(p);
  41. if(qr<=mid)return query(lc,ql,qr);
  42. if(ql>mid)return query(rc,ql,qr);
  43. int L=query(lc,ql,mid),R=query(rc,mid+1,qr);
  44. return q[L].w>=q[R].w?L:R;
  45. }
  46. int main(){
  47. n=read(),m=read();
  48. for(int i=1;i<=n;++i)a[i]=read();
  49. sort(a+1,a+n+1);
  50. for(int i=1;i<=m;++i)q[i].v=read(),q[i].w=read()-q[i].v;
  51. sort(q+1,q+m+1,cmp),build(1,1,m);
  52. for(int i=1;i<=m;++i)val[i]=q[i].v;
  53. int up=max(1,n-m+1);
  54. for(int i=up;i<=n;++i){
  55. int pos=lower_bound(val+1,val+m+1,a[i])-val;
  56. if(a[i]<=val[pos])--pos;
  57. if(pos<=0)continue;
  58. ll tmp=query(1,1,pos);
  59. update(1,tmp),sum+=a[i]+q[tmp].w,s1[++top]=a[i],s2[top]=q[tmp].w,q[tmp].w=-0x3f3f3f3f;
  60. }
  61. ans=sum,sort(s1+1,s1+top+1),sort(s2+1,s2+top+1);
  62. for(int i=1;i<=top;++i)ans=max(ans,(sum-=s1[i]+s2[i]));
  63. cout<<ans;
  64. return 0;
  65. }
  66. 

2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)的更多相关文章

  1. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  2. BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)

    4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 142[Submit][Sta ...

  3. BZOJ4977: [[Lydsy1708月赛]跳伞求生

    传送门 直接贪心 考虑到 \(n\) 个人的贡献都是 \(a_i\),另外 \(m\) 个人的贡献都是 \(c_i-b_i\) 首先 \(a_i>b_j\) 的限制不好做,所以将 \(a,b\) ...

  4. 2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)

    传送门 就是让你维护动态的区间带权中位数. 然而昨晚比赛时并没有调出来. 想找到带权中位数的中点可以二分(也可以直接在线段树上找). 也就是二分出第一个断点,使得断点左边的和恰好大于或等于断点右边的和 ...

  5. 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生

    Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...

  6. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

  7. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

  8. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  9. [bzoj4977]跳伞求生<贪心>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4977 这是八月月赛的一道题,月赛的时候和同学讨论了一下,最后由一位叫二哥的大佬率先AC,用 ...

随机推荐

  1. task 03-27

    To integrate  the spring with  jpa, Basically completed the jpa of study;To integrate  the spring wi ...

  2. Node NPM 的常用配置

    1,修改 npm 下载模块的 保存地址 <1>  进入 cmd 运行, 如下命令 npm config set prefix  "C:\Program File\NodeJs\p ...

  3. HTML5 Canvas ( 绘制一轮弯月, 星空中的弯月 )

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. RabbitMQ-从基础到实战(4)— 消息的交换(中)

    转自:https://www.cnblogs.com/4----/p/6590459.html 1.简介 本章节和官方教程相似度较高,英文好的可以移步官方教程 在上一章的例子中,我们创建了一个消费者, ...

  5. 使用REGINI修改注册表权限

    regini regset.ini 就行啦 regset.ini 是你要修改的数据 1.注册表修改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr ...

  6. eclipse 乱码

    svn乱码: 教你解决Eclipse中SVN比较乱码问题 workspace->utf-8设置后成功! console乱码: 项目右键 :  run as configuration 设置com ...

  7. eclipse 注释字体不一致的问题

    eclipse中 1.解决注释的文字大小不一的情况 2.想让注释和代码大小不一样 3.win10系统下,设置Text Font时找不到Courier New字体 1.解决注释的文字大小不一的情况 打开 ...

  8. String类的intern()方法

    0.引言 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin"); ...

  9. 一个完整的Oracle建表的例子

    建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: [sql] CREATE TABLE ban ...

  10. hive 抽样方法

    select * from (select *from advert.dws_advert_order_model_sample_pcvr_v2_diwhere dt>= date_sub('$ ...