线段树模板(区间最值)
来源:互联网 发布:多序列比对算法 编辑:程序博客网 时间:2024/05/21 09:22
线段树模板(区间最值)
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;typedef long long LL;const int N = 2e5;const int mol = 1e9 + 7;int a[N * 2] , b[N * 2];int l , r , setv[N * 4 * 2 + 10] , v , _sum , p;void update(int o , int L , int R) o是节点{ int M = (L + R) >> 1; if(L == R) setv[o] = v; else { if(p <= M) update(o * 2 , L , M); else update(o * 2 + 1 , M + 1 , R); setv[o] = max(setv[o * 2] , setv[o * 2 + 1]); }}void query(int o , int L , int R){ int M = (L + R) >> 1; if(l <= L && r >= R) _sum = max(_sum , setv[o]); else{ if(l <= M) query(o * 2 , L , M); if(r > M) query(o * 2 + 1 , M + 1 , R); }}int main(){ int n; while(~scanf("%d",&n)){ for(int i = 1 ; i <= n ; i++) scanf("%d",&a[i]); for(int i = 1 ; i <= n ; i++) scanf("%d",&b[i]); sort(b + 1 , b + 1 + n); for(int i = 1 ; i <= n ; i++){ p = i; v = a[i] - i; update(1 , 1 , 2 * n); } LL sum = 0; for(int i = n + 1 ; i <= 2 * n ; i++){ l = b[i - n] , r = i - 1; _sum = 0; query(1 , 1 , 2 * n); sum = (sum + _sum) % mol; p = i; v = _sum - i; update(1 , 1 , 2 * n); } printf("%d\n",sum); } return 0;}
阅读全文
1 0
- 线段树模板(区间最值)
- 【模板】线段树区间最值
- 【模板】线段树_区间最值、区间求和、修改
- 【模板】线段树区间修改、区间求和、查询最值
- 线段树大模板(区间更新,单点更新,查询区间最值等等)
- 线段树模板-单点替换区间最值
- 洛谷1531 线段树模板:区间最值
- RMQ区间最值(线段树)
- 线段树模板题(结构体&一维数组)(区间最值,求和)
- hdoj I Hate It 1754 (线段树区间最值 模板)
- POJ 3264 Balanced Lineup (区间最值 RMQ模板/线段树)
- 区间最值线段树
- 线段树,区间最值
- 线段树 单点增减,单点替换,区间最值,区间求和(模板)
- [线段树 区间最值操作 模板 Segment tree Beats!] BZOJ 4695 最假女选手
- 线段树模板(区间更新)
- 模板:线段树(2)区间修改
- 线段树模板(区间乘混加)
- android平台架构
- 数据报表的七个原则
- strcpy和strnpy的用法
- 程序员不懒惰!2017,软考为你升职加薪!
- 关于Android中系统日期时间的获取
- 线段树模板(区间最值)
- ajax的重复提交问题,和bootstrapValidator校验冲突问题解决办法
- 前台发送 ajax 请求到后台传递数组参数
- Spring Boot 快速入门
- DOM一致性检测-初步理解
- 早安心语
- Web报表系统葡萄城报表:数据高亮报表
- 大数字的加减乘法实现
- 摄影测量笔记