BZOJ2388 : 旅行规划
考虑分块,每块维护两个标记$ts,td$。
那么对于块中一个位置$i$,它的实际值为$i\times td+ts+v_i$。
修改的时候,对于整块,直接打标记,对于零散的暴力修改,然后重构凸壳,时间复杂度$O(\sqrt{n})$。
查询的时候在凸壳上二分即可,时间复杂度$O(\sqrt{n}\log n)$。
#include<cstdio>
#define N 100010
typedef long long ll;
int n,m,cnt,lim,i,op,x,y,pos[N],st[N],en[N],R[N],q[N];ll v[N],ts[N],td[N];
inline int read(){char c;bool f=0;int a=0;while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));if(c!='-')a=c-'0';else f=1;while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';if(f)a=-a;return a;
}
inline double cross(int x,int y){return(double)(v[x]-v[y])/(double)(y-x);}
inline void build(int x){int i,L=st[x],t=L;q[t]=t;for(i=t+1;i<=en[x];q[++t]=i++)while(t>L&&cross(i,q[t])<=cross(q[t],q[t-1]))t--;R[x]=t;
}
inline void change(int x,int y,ll s,ll d){if(pos[x]==pos[y]){for(int i=x;i<=y;i++)v[i]+=s+d*i;build(pos[x]);return;}for(int i=pos[x]+1;i<pos[y];i++)ts[i]+=s,td[i]+=d;for(int i=en[pos[x]];i>=x;i--)v[i]+=s+d*i;build(pos[x]);for(int i=st[pos[y]];i<=y;i++)v[i]+=s+d*i;build(pos[y]);
}
inline void modify(int x,int y,ll z){change(x,y,z*(1-x),z);if(y<n)change(y+1,n,z*(y-x+1),0);
}
inline void up(ll&a,ll b){if(a<b)a=b;}
inline ll ask(int x){int t=st[x],l=t+1,r=R[x],mid;while(l<=r){mid=(l+r)>>1;if(cross(q[mid-1],q[mid])<td[x])l=(t=mid)+1;else r=mid-1;}return td[x]*q[t]+ts[x]+v[q[t]];
}
inline ll query(int x,int y){ll t=-(1LL<<62);if(pos[x]==pos[y]){for(int i=x;i<=y;i++)up(t,td[pos[i]]*i+ts[pos[i]]+v[i]);return t;}for(int i=pos[x]+1;i<pos[y];i++)up(t,ask(i));for(int i=en[pos[x]];i>=x;i--)up(t,td[pos[i]]*i+ts[pos[i]]+v[i]);for(int i=st[pos[y]];i<=y;i++)up(t,td[pos[i]]*i+ts[pos[i]]+v[i]);return t;
}
int main(){n=read();for(i=1;i<=n;i++)v[i]=v[i-1]+read();while(lim*lim*8<n)lim++;for(i=1;i<=n;i++)pos[i]=(i-1)/lim+1;cnt=pos[n];for(i=1;i<=n;i++)en[pos[i]]=i;for(i=n;i;i--)st[pos[i]]=i;for(i=1;i<=cnt;i++)build(i);m=read();while(m--){op=read(),x=read(),y=read();if(!op)modify(x,y,read());else printf("%lld\n",query(x,y));}return 0;
}
转载于:https://www.cnblogs.com/clrs97/p/4984182.html
BZOJ2388 : 旅行规划相关推荐
- BZOJ2388: 旅行规划
http://www.lydsy.com/JudgeOnline/problem.php?id=2388 带区间加修改,求区间内的最大前缀和. 设sum[i]代表i的前缀和,tag[i][j]代表i到 ...
- 【分块】[LUOGU 旅行规划] 分块+二分+凸包优化
题目: 题目链接:[LUOGU 旅行规划] 题解: (由于这个,,我竟然还去写了二维凸包的模板题作为练习,,,然而,一点用都没有,,,,) 先解释一下题面的意思:就是一个区间加的操作,再加上一个区间的 ...
- 青岛旅行规划及玩后感
之前一直属于宅男类型,出去玩也都是周边短途1日游,不需要什么规划,想来去南浔的那次属于最有规划的了,网上订了门票,其他的都是走到哪算到哪. 2012年6月30号的青岛行算是第一次意义上自己的规划旅行, ...
- 离散数学图论旅行规划问题_《图论及其应用》(一)
点击返回目录 一. 定义 1.1 图的基本概念 图或有序对或序偶(P1).有限图/平凡图/非平凡图/空图(P1).顶点数或阶数/边数/重数/重边/环(P1).简单图/复合图(P1).相邻(P2).相关 ...
- 离散数学图论旅行规划问题_2020年MathorCup高校数学建模挑战赛——C 题 仓内拣货优化问题...
下面的链接是精华版思路,亮点是对第六问的探讨. 高度概括一下:第一问曼哈顿,第二问用免疫,三问增加任务单,四问增加拣货员,五问改变复核台,六问亮点来探讨~ 有点皮 MathorCup C题 仓内拣货优 ...
- 离散数学图论旅行规划问题_旅游路径规划问题.pdf
参赛密码 (由组委会填写) 第十二届 "中关村青联杯"全 国研 究生 第十二届 "中关村青联杯"全 国研 究生 数学建模竞赛 数学建模竞赛 题 目 旅游路径规划 ...
- Google地图的trip plan是旅行规划的好帮手!
- @bzoj - 2388@ 旅行规划
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你维护一个序列,支持两种操作: (1)某个区间 [x, y] ...
- c语言旅行规划问题,利用动态规划法求解旅行商问题(TSP)的C语言实现(一)...
算法改进:通过改进集合操作降低比较次数,利用二进制表示集合.确定元素k是否在集合S中的比较次数为1,从而降低了时间复杂度到O(n2^n) #include #include #include #inc ...
最新文章
- Android 基本面试题
- innobackupex自动备份脚本
- golang避免XSS攻击
- css 可编辑,如何设置DIV可编辑
- python爬虫之路scrapy
- 【数据结构和算法笔记】用c和c++分别实现二叉搜索树
- Aloha:一个略屌的分布式任务调度框架
- 关于交流电路的谐振等问题
- 地理信息系统(GIS)系列——ArcGIS API for JavaScript 3.9(2)
- 软件测试——测试流程重要性
- 上海海洋大学计算机二级成绩,上海海洋大学是几本 2018分数线是多少分
- 计算机之父童年的故事ppt,24计算机之父童年的故事
- filco的pin码_filco蓝牙键盘配对流程,filco 忍者二代 蓝牙怎么
- mysql cpu 内存的选择
- 电路设计经验总结(以软件cadence allegro为例)
- Verilog利用状态机实现的交通灯控制
- 在TTF字体中提取指定文字
- 织梦DEDECMS介绍下载安装
- 计算机不能上网 检查路线,电脑上不了网怎么解决?
- 使用 dockerfile 构建 WordPress 环境
热门文章
- Linux进程状态如何切换,Linux系统如何切换前台进程和后台进程(2)
- jquery 控制CSS属性display 实现元素的显示、隐藏
- 量子计算机新科技未来,能够“预测多个未来”的量子计算机诞生
- sklearn常用模块
- REST API解析
- 陈百强原来这么帅_外套假两件,原来这么帅。
- bootstrap 栅栏剧中_Bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法...
- 矩阵迹的性质_矩阵(含逆)的迹、行列式关于矩阵自身的导数计算与Maple验证...
- 10以内数的组成分解图_学前儿童如何学习20以内的加减法,收藏了
- 自然语言系列学习之表示学习与知识获取(七)利用关系路径进行关系抽取