CodeForces 332B Maximum Absurdity(线段树单点更新)
题意:
给你一个序列,找两个长度为 k 且没有重合区间的数使得其和最大
解析:
线段树,就是把起点为 i 长度为 k 的和预处理出来,再枚举a,与a线段不重合的,后面的部分用线段树来找最大位置,总复杂度O(nlog(n))O(nlog(n))。
mymy codecode
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ls (o<<1)
#define rs (o<<1|1)
#define lson ls, L, M
#define rson rs, M+1, R
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;ll sumv[N<<2], x[N];void build(int o, int L, int R) {if(L == R) {sumv[o] = x[L];return ;}int M = (L+R)/2;build(lson);build(rson);sumv[o] = sumv[ls] + sumv[rs];
}ll query(int o, int L, int R, int ql, int qr) {if(ql <= L && R <= qr)return sumv[o];int M = (L + R)/2;ll ret = 0;if(ql <= M) ret += query(lson, ql, qr);if(qr > M) ret += query(rson, ql, qr);return ret;
}struct Segment {int L, R;ll sum;
} s[N];ll maxv[N<<2];
int posv[N<<2];
void pushUp(int o) {if(maxv[ls] >= maxv[rs]) {maxv[o] = maxv[ls];posv[o] = posv[ls];}else {maxv[o] = maxv[rs];posv[o] = posv[rs];}
}void build2(int o, int L, int R) {if(L == R) {maxv[o] = s[L].sum;posv[o] = s[L].L;return ;}int M = (L + R)/2;build2(lson);build2(rson);pushUp(o);
}ll _maxv;
int site;
void find(int o, int L, int R, int ql, int qr) {if(ql <= L && R <= qr) {if(_maxv < maxv[o]) {_maxv = maxv[o];site = posv[o];}return ;}int M = (L+R)/2;if(ql <= M) find(lson, ql, qr);if(qr > M) find(rson, ql, qr);
}int n, k;
int main() {while(scanf("%d%d", &n, &k) != EOF) {for(int i = 1; i <= n; i++)scanf("%lld", &x[i]);build(1, 1, n);for(int i = 1; i <= n - k + 1; i++) {s[i].L = i, s[i].R = i+k-1;s[i].sum = query(1, 1, n, s[i].L, s[i].R);}int last = n-k+1;build2(1, 1, last);int a, b; ll maxSum = -INF;for(int i = 1; i < last; i++) {_maxv = -INF;find(1, 1, last, s[i].R+1, last);if(maxSum < s[i].sum + _maxv) {maxSum = s[i].sum + _maxv; a = i, b = site;}}printf("%d %d\n", a, b);}return 0;
}
CodeForces 332B Maximum Absurdity(线段树单点更新)相关推荐
- 【CodeForces 332B --- Maximum Absurdity】递推
[CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...
- [CodeForces 332B]Maximum Absurdity[DP]
题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...
- HDUOJ----1166敌兵布阵(线段树单点更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
- HDU - 1166敌兵布阵+HDU-1754 I Hate It (线段树单点更新——累加/最大值)
线段树单点更新,模板题 HDU1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...
- 【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...
[原创]tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询) 最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不 ...
- FZU 2297 Number theory【线段树/单点更新/思维】
Given a integers x = 1, you have to apply Q (Q ≤ 100000) operations: Multiply, Divide. Input First l ...
- CDOJ 1073 线段树 单点更新+区间查询 水题
H - 秋实大哥与线段树 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit S ...
- CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
题目链接: http://codeforces.com/contest/19/problem/D 题意: 有三种操作"add x y"往平面上添加(x,y)这个点,"re ...
最新文章
- 你了解计算机系统的层次结构吗?计算机语言怎么发展的?
- 4G EPS 中的小区选择
- 三种Target Encoding方式总结
- GNU C中的零长度数组
- 《微服务设计》(三)---- 集成
- SpringSecurity注销功能
- 从李一男,到美女博士姚婷,任正非:要把中国的天才,留在中国
- 500万数据mysql_mysql 单表500万数据经过处理后新增到新表
- qt mysql分页控件_Qt分页布局与切分窗口的实现
- 深入理解IntentService
- radius服务器mac_连如何抵御MAC攻击都不知道 过年还如何抵御三姑六婆的魔法攻击...
- 【转载】斐讯K2P B1刷入金梅林固件,加koolproxy、S-S R等【V1.0尝鲜版】
- 【免费领取】石杉架构班Kafka消息中间件内核源码课程
- hotmail邮箱设置
- warning: variable ‘a‘ set but not used [-Wunused-but-set-variable]
- 蓝牙「5.0」和「4.2」的区别???
- TOJ 5238: C实验:变量交换函数
- 2021支付宝集五福最新最全攻略:万能福沾沾福敬业福
- Android GMS认证项总结
- android 图库管理,Android调用系统图库