博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019年牛客多校第一场 I题Points Division 线段树+DP
阅读量:5084 次
发布时间:2019-06-13

本文共 3170 字,大约阅读时间需要 10 分钟。

题目链接

题意

给你\(n\)个点,每个点的坐标为\((x_i,y_i)\),有两个权值\(a_i,b_i\)

现在要你将它分成\(\mathbb{A},\mathbb{B}\)两部分,使得在满足“\(\mathbb{A}\)的点不能落在在\(\mathbb{B}\)的点的右下方”的条件下\(\sum\limits_{i\in\mathbb{A}}a_i+\sum\limits_{j\in\mathbb{B}}b_j\)最大。

思路

讲得很详细,大家可以看这位大佬的昂~

代码实现如下

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;typedef pair
pLL;typedef pair
pLi;typedef pair
pil;;typedef pair
pii;typedef unsigned long long uLL;#define lson rt<<1#define rson rt<<1|1#define lowbit(x) x&(-x)#define name2str(name) (#name)#define bug printf("*********\n")#define debug(x) cout<<#x"=["<
<<"]" <
vec;struct Point { int x, y, a, b; bool operator < (const Point& pp) const { return x == pp.x ? y > pp.y : x < pp.x; }}point[maxn];struct node { int l, r; LL mx, lazy;}segtree[maxn<<2];void push_up(int rt) { segtree[rt].mx = max(segtree[lson].mx, segtree[rson].mx);}void push_down(int rt) { LL x = segtree[rt].lazy; segtree[rt].lazy = 0; segtree[lson].lazy += x; segtree[rson].lazy += x; segtree[lson].mx += x; segtree[rson].mx += x;}void build(int rt, int l, int r) { segtree[rt].l = l, segtree[rt].r = r; segtree[rt].mx = segtree[rt].lazy = 0; if(l == r) return; int mid = (segtree[rt].l + segtree[rt].r) >> 1; build(lson, l, mid); build(rson, mid + 1, r);}void update1(int rt, int pos, LL val) { if(segtree[rt].l == segtree[rt].r) { segtree[rt].mx = val; return; } push_down(rt); int mid = (segtree[rt].l + segtree[rt].r) >> 1; if(pos <= mid) update1(lson, pos, val); else update1(rson, pos, val); push_up(rt);}void update2(int rt, int l, int r, LL val) { if(segtree[rt].l == l && segtree[rt].r == r) { segtree[rt].mx += val; segtree[rt].lazy += val; return; } push_down(rt); int mid = (segtree[rt].l + segtree[rt].r) >> 1; if(r <= mid) update2(lson, l, r, val); else if(l > mid) update2(rson, l, r, val); else { update2(lson, l, mid, val); update2(rson, mid + 1, r, val); } push_up(rt);}LL query(int rt, int l, int r) { if(segtree[rt].l == l && segtree[rt].r == r) { return segtree[rt].mx; } push_down(rt); int mid = (segtree[rt].l + segtree[rt].r) >> 1; if(r <= mid) return query(lson, l, r); else if(l > mid) return query(rson, l, r); else return max(query(lson, l, mid), query(rson, mid + 1, r));}int main() {#ifndef ONLINE_JUDGEFIN;#endif // ONLINE_JUDGE while(~scanf("%d", &n)) { vec.clear(); for(int i = 1; i <= n; ++i) { scanf("%d%d%d%d", &point[i].x, &point[i].y, &point[i].a, &point[i].b); vec.push_back(point[i].y); } sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end()); sort(point + 1, point + n + 1); for(int i = 1; i <= n; ++i) { point[i].y = lower_bound(vec.begin(), vec.end(), point[i].y) - vec.begin() + 1; } int sz = vec.size(); build(1, 0, sz + 1); for(int i = 1; i <= n; ++i) { LL num = query(1, 0, point[i].y); update1(1, point[i].y, num + point[i].b); update2(1, 0, point[i].y - 1, point[i].a); update2(1, point[i].y + 1, sz + 1, point[i].b); } printf("%lld\n", segtree[1].mx); } return 0;}

转载于:https://www.cnblogs.com/Dillonh/p/11216839.html

你可能感兴趣的文章
Spring MVC 入门(二)
查看>>
格式化输出数字和时间
查看>>
页面中公用的全选按钮,单选按钮组件的编写
查看>>
java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
查看>>
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
python的列表与shell的数组
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>