正题

luogu
CF1648D


题目大意

有一个 3*n 的矩阵,1,3行没有行走限制,对于第2行,有m个区间,覆盖第 i 个区间有 kik_iki​ 的代价,只有覆盖的位置才能走,让你从 (1,1) 走到 (3,n)(只能向下和向右走) ,答案为经过的每个点的权值之和减去代价之和,问你答案最大值


解题思路

可以把第2行的权值用前缀和计算,令 Ai=∑j=1is1,j−∑j=1i−1s2,j,Bi=∑j=ins3,j+∑j=1is2,jA_i=\sum_{j=1}^i s_{1,j}-\sum_{j=1}^{i-1} s_{2,j},B_i=\sum_{j=i}^n s_{3,j}+\sum_{j=1}^{i} s_{2,j}Ai​=∑j=1i​s1,j​−∑j=1i−1​s2,j​,Bi​=∑j=in​s3,j​+∑j=1i​s2,j​

答案就转化为了在第二行走一段路答案为 Abg+BedA_{bg}+B_{ed}Abg​+Bed​,这个可以先按区间的左端点排序,然后再线段树上依次往后贡献即可


code

#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 500500
using namespace std;
ll n,m,sum,ans,X[N],Y[N],Z[N],a[4][N],b[N];
vector<ll>l[N];
const ll inf=1e18;
struct Tree
{#define ls x*2#define rs x*2+1ll s[N<<2],v[N<<2],lazy[N<<2],lazyy[N<<2];void push_up(ll x){s[x]=max(s[ls],s[rs]);v[x]=max(v[ls],v[rs]);return;}void get(ll x,ll ad,ll an){s[x]=max(s[x],max(v[x]-ad,an));lazy[x]=min(lazy[x],ad);lazyy[x]=max(lazyy[x],an);return;}void push_down(ll x){get(ls,lazy[x],lazyy[x]);get(rs,lazy[x],max(lazyy[x],max(v[ls],s[ls])-lazy[x]));lazy[x]=inf;lazyy[x]=-inf;return;}void build(ll x,ll l,ll r){s[x]=lazyy[x]=-inf;lazy[x]=inf;if(l==r){v[x]=b[l];return;}ll mid=l+r>>1;build(ls,l,mid);build(rs,mid+1,r);push_up(x);return;}ll change(ll x,ll L,ll R,ll l,ll r,ll ad,ll an){if(L==l&&R==r){get(x,ad,an);return max(v[x],s[x]);}push_down(x);ll mid=L+R>>1,g;if(r<=mid)g=change(ls,L,mid,l,r,ad,an);else if(l>mid)g=change(rs,mid+1,R,l,r,ad,an);else{g=change(ls,L,mid,l,mid,ad,an);g=max(g,change(rs,mid+1,R,mid+1,r,ad,max(an,g-ad)));}push_up(x);return g;}ll ask(ll x,ll l,ll r,ll y){if(l==r)return s[x];push_down(x);ll mid=l+r>>1;if(y<=mid)return ask(ls,l,mid,y);else return ask(rs,mid+1,r,y);}
}T;
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=3;++i)for(ll j=1;j<=n;++j)scanf("%lld",&a[i][j]);for(ll i=1;i<=n;++i)b[i]=b[i-1]+a[1][i]-a[2][i-1];for(ll i=1;i<=m;++i){scanf("%lld%lld%lld",&X[i],&Y[i],&Z[i]);l[X[i]].push_back(i);}T.build(1,1,n);for(ll i=1;i<=n;++i)for(ll j=0;j<l[i].size();++j)T.change(1,1,n,i,Y[l[i][j]],Z[l[i][j]],(i>1?T.ask(1,1,n,i-1)-Z[l[i][j]]:-inf));for(ll i=1;i<=n;++i)sum+=a[3][i];ans=-inf;for(ll i=1;i<=n;++i){b[i]=b[i-1]+a[2][i]-a[3][i-1];ans=max(ans,sum+b[i]+T.ask(1,1,n,i));}printf("%lld",ans);return 0;
}

【线段树】Serious Business(CF1648D)相关推荐

  1. 【Codeforces】WHU校赛2019 Store(线段树+二分)

    题目链接 C. Store time limit per test 1.0 s memory limit per test 256 MB input standard input output sta ...

  2. HDU 6447 YJJ's Salesman(线段树+DP)

    YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  3. HDU-6447-YJJ's Salesman(离散化+01dp,线段树维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 Problem Description YJJ is a salesman who has tr ...

  4. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  5. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  6. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  7. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  8. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  9. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  10. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

最新文章

  1. javascript 实现页面显示当前时间 动态读秒
  2. php经典100例,php趣味100例 - php天平称物
  3. 将Excel数据导入SQL Server数据库
  4. excel运行最多行数
  5. 用squid配置代理服务器(基于Ubuntu Server 12.04)
  6. 映射网络驱动器后为什么每次都要重新连接_如何映射网络驱动器?
  7. html柳树动画,3D教程-柳树生长动画
  8. [Linux] 如何让linux加载当前目录的动态库
  9. mysql把某一列的数据更新到另一列中(涉及到多张表的数据)
  10. (转)Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
  11. GaussDB Hash表分布列选择原则及数据倾斜检测
  12. 谷歌插件 axure +去广告插件
  13. 【DVB】【ATSC】ATSC和DVB数字电视系统的比较
  14. linux文件增加自定义属性,Linux 笔记...文件和目录属性useradd、userdel、usermod 、passwd...
  15. 高等数学:极值点一定连续吗?间断点可以是极值点吗?
  16. 社会工程管理——股权分配
  17. 聊天框 让滚动条保持到最底端的一种方式 scrollTop!
  18. Windows CE 6.0完整版免费下载 下载地址
  19. 英伟达点开后显示无法连接服务器,解决win10提示“无法连接到 NVIDIA 检查您的互联网连接”的教程...
  20. 问题 M: 【字符串】贝贝的数学课

热门文章

  1. fb静态区域_fb 静态数据
  2. mysql 大小写 if_【已解决】Windows下 MySQL大小写敏感 解决方案及分析
  3. 苏泊尔搭载华为鸿蒙系统,华为鸿蒙打算在一年内跨过生死线,拿下16%的市场份额...
  4. mysql导入数据提前修改字段_Mysql一些导入导出数据库,添加修改字段命令_MySQL...
  5. c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】
  6. react 版权问题_react使用fetch封装请求的方法-简单易懂
  7. s2 安恒 漏洞验证工具_Struts2漏洞利用工具下载(更新2017-V1.8版增加S2-045/S2-046)
  8. leedcode344. 反转字符串
  9. android 那几种动画,Android 动画实现几种方案
  10. 全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理