题目链接: https://ac.nowcoder.com/acm/contest/881/I

题意: 给你n个点,每个点的坐标为(xi,yi),有两个权值ai,bi。
现在要你将它分成A,B两部分,使得在满足“A的点不能落在在B的点的右下方”的条件下∑i∈Aai+∑j∈Bbj最大。

思路:可以参考一下大佬的博客

  • https://www.cnblogs.com/buerdepepeqi/p/11231875.html
  • https://blog.csdn.net/u013534123/article/details/96465704
  • https://www.cnblogs.com/Dillonh/p/11216839.html

代码:

下午的时候,看了大佬写的博文,也按着他的思路自己敲了一遍,后面发现自己忘记开long long 就索性全文替换了,改完之后再交发现还是没过,emmmmmm(只通过0.01%的样例), 晚上突然一想到,我去,忘记初始化lazy了,哎…

#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e5 + 5;
long long node[MAXN<<2], lazy[MAXN<<2];inline void PushUp(long long root)
{node[root] = max(node[root<<1], node[root<<1|1]);
}inline void BuildTree(long long root, long long l, long long r)
{if(l == r){node[root] = 0;return ;}//lazy 也要初始化,否则会有遗留lazy[root] = 0;long long mid = (l + r) >> 1;BuildTree(root<<1, l, mid);BuildTree(root<<1|1, mid + 1, r);PushUp(root);}inline void PushDown(long long root, long long ln, long long rn)
{if(lazy[root]){lazy[root<<1] += lazy[root];lazy[root<<1|1] += lazy[root];node[root<<1] += lazy[root];node[root<<1|1] += lazy[root];lazy[root] = 0;}}inline void Update(long long root, long long l, long long r, long long index, long long value)
{if(l == r){node[root] = value;return ;}long long mid = (l + r) >> 1;PushDown(root, mid - l + 1, r - mid);if(index <= mid)Update(root<<1, l, mid, index, value);elseUpdate(root<<1|1, mid + 1, r, index, value);PushUp(root);
}inline void Update(long long root, long long l, long long r, long long L, long long R, long long value)
{if(L <= l && r <= R){node[root] += value;lazy[root] += value;return ;}long long mid = (l + r) >> 1;PushDown(root, mid - l + 1, r - mid);if(L <= mid)Update(root<<1, l, mid, L, R, value);if(R > mid)Update(root<<1|1, mid + 1, r, L, R, value);PushUp(root);
}inline long long Query(long long root, long long l, long long r, long long L, long long R)
{if(L <= l && r <= R){return node[root];}long long mid = (l + r) >> 1;PushDown(root, mid - l + 1, r - mid);long long ans = 0;if(L <= mid)ans = max(ans, Query(root<<1, l, mid, L, R));if(R > mid)ans = max(Query(root<<1|1, mid + 1, r, L, R), ans);return ans;
}
//
struct p
{long long x;long long y;long long a;long long b;friend bool operator <(const p as, p bs){return (as.x == bs.x) ? as.y > bs.y : as.x < bs.x;}
};
/*
long long cmp(p as, p bs)
{return (as.x == bs.x) ? as.y > bs.y : as.x < bs.x;
}
*/
int main()
{ios::sync_with_stdio(false);long long n;while(cin >> n){vector<p> nodeVe;vector<long long> nVe;long long x, y, a, b;for(long long i = 1; i <= n; i++){cin >> x >> y >> a >> b;nodeVe.push_back(p{x, y, a, b});nVe.push_back(y);           //存在y, 后面对其进行离散化}sort(nVe.begin(), nVe.end());nVe.erase(unique(nVe.begin(), nVe.end()), nVe.end());//对Y进行离散化for(long long i = 0; i < n; i++){nodeVe[i].y = lower_bound(nVe.begin(), nVe.end(), nodeVe[i].y) - nVe.begin() + 1;}//sort(nodeVe.begin(), nodeVe.end(), cmp);sort(nodeVe.begin(), nodeVe.end());//建树,并初始化0,long long nTreeSize = nVe.size();BuildTree(1, 0, nTreeSize);     // 因为我们是y来进行dp, 所以树的大小就是nVe.size();//维护区间最值for(long long i = 0; i < n; i++){//修改这个点贡献即 dp[i]Update(1, 0, nTreeSize, nodeVe[i].y, Query(1, 0, nTreeSize, 0, nodeVe[i].y) + nodeVe[i].b);//更新左子树,右子树if(nodeVe[i].y - 1 >= 0) Update(1, 0, nTreeSize, 0, nodeVe[i].y - 1, nodeVe[i].a);if(nodeVe[i].y + 1 <= nTreeSize) Update(1, 0, nTreeSize, nodeVe[i].y + 1, nTreeSize, nodeVe[i].b);}cout << node[1] << endl;}return 0;
}

注释我按着自己的理解写的,如有误,可以指出,谢谢!

2019牛客暑期多校训练营(第一场场)_I题Points Division(线段树+DP维护区间最大值)相关推荐

  1. 2021牛客暑期多校训练营1 J-Journey among Railway Stations(线段树+思维转化)

    J-Journey among Railway Stations 注意区间合并时是否可行信息的合并. 假设线段树当前左节点lll维护的区间是[L,mid][L,\text{mid}][L,mid],右 ...

  2. 2019牛客暑期多校训练营(第三场)H.Magic Line

    2019牛客暑期多校训练营(第三场)H.Magic Line 题目链接 题目描述 There are always some problems that seem simple but is diff ...

  3. 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)

    2019牛客暑期多校训练营(第五场)C generator 2 思路 x0=x0x_0 = x_0x0​=x0​ x1=a∗x0∗bx_1 = a * x_0 * bx1​=a∗x0​∗b x2=a∗ ...

  4. 2019牛客暑期多校训练营(第四场)----E- triples II

    首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/884/E 来源:牛客网 涉及:位运算,容斥定义,dp 点击这里回到2019牛客暑期多校训练营解题-目 ...

  5. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

  6. 2019牛客暑期多校训练营(第九场)H Cutting Bamboos(主席树+二分)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 题目描述 There are n bamboos arranged in a line. The ...

  7. 暑假N天乐【比赛篇】 —— 2019牛客暑期多校训练营(第三场)

    这场相对来说友好一点,本来前几天就补差不多了,然后忘记发了... 以下题解包括:\(A \ \ \ B \ \ \ F \ \ \ G \ \ \ H \ \ \ J\) \(D\) 题队友补了,我也 ...

  8. 2019牛客暑期多校训练营(第一场)

    传送门 参考资料: [1]:官方题解(提取码:t050 ) [2]:标程(提取码:rvxr ) [3]:牛客题解汇总 A.Equivalent Prefixes(单调栈) •题意 定义两个数组 u,v ...

  9. 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)

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

最新文章

  1. css如何设置dialog,css-dialog提示
  2. 10个比较艰难的Java面试题与答案!
  3. TC专访Waymo首席技术官:谷歌自动驾驶的过去和未来
  4. Android分包方案multidex
  5. 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
  6. 奥林匹克数学竞赛教练员汇编,最牛奥数资料全集!
  7. 看懂云计算、虚拟化和容器,这一篇就够啦!
  8. android layout 渲染,java – 渲染android.support.design.widget.CoordinatorLayout的问题
  9. PMP考试重点总结四——规划过程组(2)
  10. ps总结(一)-无失真的放大图片
  11. python 解决transform.rescale操作,本应得到彩色图像,然而所得图像为灰色图像问题
  12. 解决unable to access ‘https://github.com/xxx/xxx.git/‘: OpenSSL SSL_read: Connection was reset, errno
  13. Linux Bind 安装
  14. 王者荣耀登录显示换服务器是不是封号,王者荣耀这么查看封号原因?千万不要这么做!...
  15. html画布动画,画布动画(Canvas Animation)
  16. 夯实基础,踏步云升 | 云原生 DevOps 入门必读
  17. 【JY】YJK前处理参数详解及常见问题分析(一)
  18. Mac pro 突然没有办法按住shift打出大写S
  19. 重量级ASP.NET资源
  20. 扭矩大好还是马力大好_马力大和扭矩大哪个更重要,马力和扭矩详解

热门文章

  1. 《OpenGL 模型》 渲染出帅气的暗影战士
  2. 登录服务器客户端密码修改,客户端服务器登录密码问题
  3. 惠普电脑Windows10安装Ubuntu16.04系统
  4. java遍历两个时间戳之间的每一天
  5. 使用爬虫xpath解析出现“<Element p at 0x3382300>”错误
  6. 共同富裕-三大维度-各省份、城市、农村基尼系数-附带多种计算方法
  7. [计算机组成原理]输入输出系统与I/O方式详解
  8. 软件测试--通用测试用例写作【转载】
  9. Python爬虫配置Selenium库+设置无图无头属性
  10. git提交代码出现错误remote: [31mx-oauth-basic: Incorrect username or password (access token)