2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)
传送门
线段树好题。
这题一看我就想贪心。
先把a,b数组排序。
然后我们选择a数组中最大的b个数(不足b个就选a个数),分别贪心出在b数组中可以获得的最大贡献。
这时可以用线段树优化。
然后交上去只能过一个点(雾
调了很久都没有发现错误点。
于是搜题解。
发现大家的做法都跟我不一样233。
但我不能放弃。
就在这时我发现有可能每次贪心出的最大贡献可能是负数233。
于是我们把每次的决策都记下来。
最后枚举删去最小的决策(有可能是负数,这样答案会增加)之后的贡献来更新答案。
代码:
#include<bits/stdc++.h>
#define N 100005
#define ll long long
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,m,top;
bool vis[N];
ll ans=0,sum=0,val[N],a[N],s1[N],s2[N];
struct node{int v;ll w;}q[N];
struct Node{int l,r;ll mx;}T[N<<2];
inline bool cmp(node a,node b){return a.v<b.v;}
inline ll max(ll a,ll b){return a>b?a:b;}
inline void pushup(int p){T[p].mx=max(T[lc].mx,T[rc].mx);}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(l==r){T[p].mx=q[l].w;return;}
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int k){
if(T[p].l==T[p].r){T[p].mx=-0x3f3f3f3f;return;}
if(k<=mid)update(lc,k);
else update(rc,k);
pushup(p);
}
inline int ask(int p){
if(T[p].l==T[p].r)return T[p].l;
if(T[lc].mx==T[p].mx)return ask(lc);
return ask(rc);
}
inline int query(int p,int ql,int qr){
if(ql<=T[p].l&&T[p].r<=qr)return ask(p);
if(qr<=mid)return query(lc,ql,qr);
if(ql>mid)return query(rc,ql,qr);
int L=query(lc,ql,mid),R=query(rc,mid+1,qr);
return q[L].w>=q[R].w?L:R;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)a[i]=read();
sort(a+1,a+n+1);
for(int i=1;i<=m;++i)q[i].v=read(),q[i].w=read()-q[i].v;
sort(q+1,q+m+1,cmp),build(1,1,m);
for(int i=1;i<=m;++i)val[i]=q[i].v;
int up=max(1,n-m+1);
for(int i=up;i<=n;++i){
int pos=lower_bound(val+1,val+m+1,a[i])-val;
if(a[i]<=val[pos])--pos;
if(pos<=0)continue;
ll tmp=query(1,1,pos);
update(1,tmp),sum+=a[i]+q[tmp].w,s1[++top]=a[i],s2[top]=q[tmp].w,q[tmp].w=-0x3f3f3f3f;
}
ans=sum,sort(s1+1,s1+top+1),sort(s2+1,s2+top+1);
for(int i=1;i<=top;++i)ans=max(ans,(sum-=s1[i]+s2[i]));
cout<<ans;
return 0;
}
2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)的更多相关文章
- BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流
题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...
- BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)
4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 446 Solved: 142[Submit][Sta ...
- BZOJ4977: [[Lydsy1708月赛]跳伞求生
传送门 直接贪心 考虑到 \(n\) 个人的贡献都是 \(a_i\),另外 \(m\) 个人的贡献都是 \(c_i-b_i\) 首先 \(a_i>b_j\) 的限制不好做,所以将 \(a,b\) ...
- 2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)
传送门 就是让你维护动态的区间带权中位数. 然而昨晚比赛时并没有调出来. 想找到带权中位数的中点可以二分(也可以直接在线段树上找). 也就是二分出第一个断点,使得断点左边的和恰好大于或等于断点右边的和 ...
- 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...
- 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)
传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*
[2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...
- [bzoj4977]跳伞求生<贪心>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4977 这是八月月赛的一道题,月赛的时候和同学讨论了一下,最后由一位叫二哥的大佬率先AC,用 ...
随机推荐
- FindWindow 查找窗口
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As ...
- top命令之你不一定懂的cpu显示信息
%st(Steal time) 是当 hypervisor 服务另一个虚拟处理器的时候,虚拟 CPU 等待实际 CPU 的时间的百分比. ------------------------------- ...
- tflearn 实现DNN 全连接
https://github.com/tflearn/tflearn/blob/master/examples/others/recommender_wide_and_deep.py import n ...
- centos 网卡聚合及Cisco交换机链路聚合
一.配置环境 centos 系统.网卡1口和2口做链路聚合. 交换机网口 6口和7口. 二.服务器操作步骤 centos 6 1.创建一个channel bonding interface #v ...
- Windows系统之hosts文件
对于Hosts文件相信很多Win7的系统用户会比较陌生,其实Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,所以功 ...
- 前端基础之Bootstrap
1. 页面加载完之后才执行的JS代码 1. DOM方式 window.onload = function(){} 2. jQuery方式 ...
- 关于元表,self,元方法__index
这是需要仔细分辨的几个概念. 元表:相当于table的隐藏属性. 只有固定的一些方法,如__index,__tostring,__add等,称为元方法. 虽然是固定的,但是任何table都可以作为任何 ...
- iOS下JS与OC互相调用(七)--Cordova 环境搭建
Cordova大家可能比较陌生,但肯定听过 PhoneGap ,Cordova 就是 PhoneGap 被 Adobe 收购后所改的名字.它是一个可以让 JS 与原生代码互相通信的一个库,并且提供了一 ...
- OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...
- [leetcode]438. Find All Anagrams in a String找出所有变位词
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...