博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3113 [USACO14DEC]马拉松赛跑Marathon_Gold 线段树维护区间最大值 模板
阅读量:5098 次
发布时间:2019-06-13

本文共 3210 字,大约阅读时间需要 10 分钟。

如此之裸…

Code:

#include
#include
#include
#include
using namespace std;const int maxn = 200000 + 3;int x[maxn], y[maxn], n, m, len;long long nex[maxn], nexx[maxn], maxv[maxn << 2], C[maxn];inline long long dist(int i,int j){
return abs(x[i] - x[j]) + abs(y[i] - y[j]); }void build(int l,int r , int o){
if(l > r) return ; if(l == r) {
maxv[o] = nexx[l]; return; } int mid = (l + r) >> 1, ls = (o << 1), rs = (o << 1)|1; build(l, mid , ls); build(mid + 1, r, rs); maxv[o] = max(maxv[ls], maxv[rs]);}inline long long query(int l,int r,int L,int R,int o){
if(l > r || r < L || l > R) return 0; if(l >= L && r <= R) {
return maxv[o]; } int mid = (l + r) >> 1, ls = (o << 1), rs = (o << 1) | 1; long long ans = 0; ans = max(ans, query(l, mid,L,R,ls)); ans = max(ans, query(mid + 1, r, L,R,rs)); return ans;}void change(int l,int r,int pos,int o){
if(l > r || r < pos || l > pos) return ; if(l == r) {
maxv[o] = nexx[pos]; return ; } int mid = (l + r) >> 1, ls = (o<<1), rs = (o << 1) |1; change(l,mid,pos,ls); change(mid + 1,r,pos,rs); maxv[o] = max(maxv[ls], maxv[rs]);}int lowbit(int t){
return t & (-t); }inline void update(int x,long long delta){
while(x <= n) {
C[x] += delta; x += lowbit(x); }}inline long long ask(int x){
long long sums = 0; while(x > 0) {
sums += C[x]; x -= lowbit(x); } return sums;}int main(){
scanf("%d%d",&n,&m); for(int i = 1;i <= n; ++i) scanf("%d%d",&x[i],&y[i]); for(int i = 1;i <= n; ++i) {
if(i < n)nex[i] = dist(i, i + 1); update(i, dist(i,i - 1));} for(int i = 1;i <= n - 2; ++i) nexx[i] = nex[i] + nex[i + 1] - dist(i, i + 2); len = n - 2; build(1, len, 1); for(int i = 1;i <= m; ++i) {
char op[10]; scanf("%s",op); if(op[0] == 'Q') {
int st, ed; scanf("%d%d",&st,&ed); long long s_ed = ask(ed); long long s_st = ask(st); printf("%lld\n",s_ed - s_st - query(1,len,st,ed - 2,1)); } else {
int id, a,b; scanf("%d%d%d",&id,&a,&b); update(id, -dist(id - 1, id)); update(id + 1, -dist(id, id + 1)); x[id] = a, y[id] = b; nex[id - 1] = dist(id - 1, id); nex[id] = dist(id, id + 1); if(id + 2 <= n) {
nexx[id] = nex[id] + nex[id + 1] - dist(id, id + 2); change(1,len, id, 1); } if(id - 1 > 0 ) {
nexx[id - 1] = nex[id - 1] + nex[id] - dist(id - 1, id + 1); change(1,len,id - 1,1); } if(id - 2 >= 1) {
nexx[id -2] = nex[id - 2] + nex[id - 1] - dist(id - 2, id); change(1,len,id - 2,1); } update(id, dist(id - 1, id)); update(id + 1, dist(id, id + 1)); } } return 0;}

转载于:https://www.cnblogs.com/guangheli/p/9845166.html

你可能感兴趣的文章
Html5 离线页面缓存
查看>>
[php]在PHP中读取和写入WORD文档的代码
查看>>
WCF傻瓜模式写程序
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Java Web学习总结(13)Listener监听器
查看>>
开始Flask项目
查看>>
Ruby:多线程队列(Queue)下载博客文章到本地
查看>>
Android打包key密码丢失找回
查看>>
03 jQuery动画
查看>>
医药箱APP静态小项目
查看>>
安装使用eclipse
查看>>
VC6.0调试技巧(一)(转)
查看>>
用Chrome调试Android手机上的网页
查看>>
django 王中王8之踏青撒花
查看>>
学习网站收集
查看>>
linux命令
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
字符环(openjudge 2755)
查看>>
php match_model的简单使用
查看>>