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,用 ...
随机推荐
- task 03-27
To integrate the spring with jpa, Basically completed the jpa of study;To integrate the spring wi ...
- Node NPM 的常用配置
1,修改 npm 下载模块的 保存地址 <1> 进入 cmd 运行, 如下命令 npm config set prefix "C:\Program File\NodeJs\p ...
- HTML5 Canvas ( 绘制一轮弯月, 星空中的弯月 )
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- RabbitMQ-从基础到实战(4)— 消息的交换(中)
转自:https://www.cnblogs.com/4----/p/6590459.html 1.简介 本章节和官方教程相似度较高,英文好的可以移步官方教程 在上一章的例子中,我们创建了一个消费者, ...
- 使用REGINI修改注册表权限
regini regset.ini 就行啦 regset.ini 是你要修改的数据 1.注册表修改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr ...
- eclipse 乱码
svn乱码: 教你解决Eclipse中SVN比较乱码问题 workspace->utf-8设置后成功! console乱码: 项目右键 : run as configuration 设置com ...
- eclipse 注释字体不一致的问题
eclipse中 1.解决注释的文字大小不一的情况 2.想让注释和代码大小不一样 3.win10系统下,设置Text Font时找不到Courier New字体 1.解决注释的文字大小不一的情况 打开 ...
- String类的intern()方法
0.引言 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin"); ...
- 一个完整的Oracle建表的例子
建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: [sql] CREATE TABLE ban ...
- hive 抽样方法
select * from (select *from advert.dws_advert_order_model_sample_pcvr_v2_diwhere dt>= date_sub('$ ...