题意

给出n个点,每个点有a,b两个属性,让你从左下角到右上角划一条线,线的左边每个点的贡献是\(a_i\),线的右边每个点的贡献是\(b_i\),使得两部分的总和最大。

分析

找一条折线将点分割开,使总和最大。

把y离散化,然后点按x排序,设\(dp[i]\)为经过第\(i\)个点(该点当作B集合中的点)的折线的权值,之前的点中在这个点上面的点dp值要加上\(b[i]\),之前的点中在这个点下面的点的dp值要加上\(a[i]\)

  • \(dp[i]=max(dp[i],dp[k]+b[i]),y[k]<=y[i]\)
  • \(dp[k]=dp[k]+b[i],y[k]>y[i]\)
  • \(dp[k]=dp[k]+a[i],y[k]<y[i]\)

用线段树来维护dp值就行了

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=1e5+10;
int n;
struct ppo{
int x,y,a,b;
bool operator <(const ppo &r) const{
if(x==r.x) return y>r.y;
return x<r.x;
}
}a[maxn];
int b[maxn],m;
ll tr[maxn<<2],tag[maxn<<2];
void pp(int p){
tr[p]=max(tr[p<<1],tr[p<<1|1]);
}
void pd(int p,ll k){
tr[p]+=k;tag[p]+=k;
}
void bd(int l,int r,int p){
tag[p]=0;
if(l==r){
tr[p]=0;return;
}int mid=l+r>>1;
bd(lson);bd(rson);pp(p);
}
void up(int x,int l,int r,int p,ll k){
if(l==r){
tr[p]=max(tr[p],k);return;
}int mid=l+r>>1;
pd(p<<1,tag[p]);pd(p<<1|1,tag[p]);tag[p]=0;
if(x<=mid) up(x,lson,k);
else up(x,rson,k);pp(p);
}
void add(int dl,int dr,int l,int r,int p,ll k){
if(l>r) return;
if(l>=dl&&r<=dr){
tr[p]+=k;tag[p]+=k;return;
}int mid=l+r>>1;
pd(p<<1,tag[p]);pd(p<<1|1,tag[p]);tag[p]=0;
if(dl<=mid) add(dl,dr,lson,k);
if(dr>mid) add(dl,dr,rson,k);pp(p);
}
ll qy(int dl,int dr,int l,int r,int p){
if(l>r) return 0;
if(l>=dl&&r<=dr){
return tr[p];
}int mid=l+r>>1;ll ret=0;
pd(p<<1,tag[p]);pd(p<<1|1,tag[p]);tag[p]=0;
if(dl<=mid) ret=max(ret,qy(dl,dr,lson));
if(dr>mid) ret=max(ret,qy(dl,dr,rson));
return ret;
}
int main(){
//ios::sync_with_stdio(false);
//freopen("in","r",stdin);
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].a,&a[i].b);
b[i]=a[i].y;
}
sort(b+1,b+n+1);
m=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++){
a[i].y=lower_bound(b+1,b+m+1,a[i].y)-b+1;
}
sort(a+1,a+n+1);
m++;
bd(1,m,1);
for(int i=1;i<=n;i++){
ll ret=qy(1,a[i].y,1,m,1);
up(a[i].y,1,m,1,ret+a[i].b);
add(1,a[i].y-1,1,m,1,a[i].a);
add(a[i].y+1,m,1,m,1,a[i].b);
}
printf("%lld\n",tr[1]);
}
return 0;
}

2019牛客暑期多校训练营(第一场)I dp+线段树的更多相关文章

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem

    题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3  4 2 3 4 输出:0 0 1 题解: 认真想一 ...

  3. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  4. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  5. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  6. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  9. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  10. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

随机推荐

  1. Mysql-Sqlalchemy-多表操作

    import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declar ...

  2. WebClient小结

    webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件.尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的 ...

  3. JS基础_打印99乘法表

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

  4. MYSQL 修改语句(数据)

    修改数据(UPDATE)     如果你失忆了,希望你能想起曾经为了追求梦想的你.     我们玩QQ.微信.淘宝等等,都会有一个操作:修改信息   淘宝常用的嘛,新增了收货地址,也可以修改它,微信/ ...

  5. Linux根文件系统和目录结构及bash特性1

    Linux文件系统:    内核并不真正负责具体的工作,这些工作是应用程序来负责的    Linux glibc    程序的编译方式:        动态链接式编译:        静态链接式编译: ...

  6. kotlin面向对象实战~

    有了java的面向对象的基础,其实对于kotlin这块的东东比较好理解,所以这里以洗衣机洗衣服为例,对面向对象进行一下实战,下面开始. 洗衣机初步: 首先先新建一个洗衣机类: 然后里面先定义基本属性: ...

  7. zeus部署

    1.下载zeus 阿里在github上已经不维护zeus了,在网上找到一个别人贡献的 https://github.com/michael8335/zeus2 下载下来 通过shell rz命令上传到 ...

  8. Ruby 中的闭包-代码块

    看了一片文章https://ruby-china.org/topics/38385讲closure的. 写下一些感想: 闭包就是 一个函数能够记住和存取它的lexical作用域,即使这个函数是在它的l ...

  9. u-boot下的DM驱动模型 阶梯状 (转)

    U-boot 下DM驱动模型的相关笔记要注意的关键两点: DM驱动模型的一般流程bind->ofdata_to_platdata(可选)->probe    启动,bind操作时单独完成的 ...

  10. spring RestTemplate 出现 NoHttpResponseException 和 ConnectionTimeoutException

    使用 httpclient.4.5.6 springboot 2.0.8RELEASE RetryExec.java CloseableHttpResponse execute() try { ret ...