YBTOJ洛谷P2042:维护数列(平衡树)

文章目录

  • 题目描述
  • 解析
    • 删除区间
    • 插入数列
    • 修改&翻转
    • 区间和&最大子段和
  • 代码

传送门

题目描述

在这里插入图片描述

解析

阴间题…
这不是裸的板子吗?
国赛真的有人能把这题写出来吗…
应该算一道练习作用很强的题了
写完这题,各种平衡树维护区间操作的方法可以说是毕业了吧
题解封装一个split函数的实现技巧值得借鉴
总的来说就一句:不要忘记pushdown和pushup!

删除区间

设删除区间为[l,r]
先把l-1结点splay到根
再把r+1转到l-1的下面
这样[l,r]一定就在r+1的右儿子了
直接删掉即可

插入数列

先在外面用类似线段树的方法建一棵完全平衡的平衡树,然后当单点接到需要的位置(寻找位置与删除类似)

修改&翻转

上标记!
把对应区间转出来,打一个标记即可

区间和&最大子段和

区间和比较无脑
最大子段和做一个经典的小白逛公园就行了

说起来很轻松,本题代码实现在传标记时还是很恶心的
总结一些易错的问题:

  1. 再说一遍:不要漏掉pushup、pushdown!
  2. 注意本题最大子段和可以是负数,所以答案不能和0取max
  3. same操作可以用一个tag记录是否需要下传比laz记录下传的值更加舒服
  4. 反转的时候最大左子段和最大右子段也要交换
  5. 本题卡空间,因此需要动态分配点编号,注意分配之前确定标记都整干净了!
  6. 插入时把一个结点接到父亲上之前要把父亲的标记下传!
  7. 任何操作几乎都要splay一下沿路更新信息

都是辛酸泪…
上代码吧
(实现已经比较简洁了算上debug还是干到了小200行…)

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e6+100;
const int M=2e6+100;
const ll mod=1ll<<31;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}
int n,m,k;
int fre[N],top;
int val[N],siz[N],f[N],lp[N],rp[N],mx[N],sum[N],r,rev[N],tag[N],tr[N][2];
#define ls (tr[x][0])
#define rs (tr[x][1])
void pushup(int x){if(!x) return;siz[x]=siz[ls]+siz[rs]+1;sum[x]=sum[ls]+sum[rs]+val[x];if(!ls&&!rs){lp[x]=rp[x]=max(0,val[x]);mx[x]=val[x];}else if(!ls){lp[x]=max(0,val[x]+lp[rs]);rp[x]=max(rp[rs],sum[rs]+val[x]);mx[x]=max(mx[rs],val[x]+lp[rs]);}else if(!rs){rp[x]=max(0,val[x]+rp[ls]);lp[x]=max(lp[ls],sum[ls]+val[x]);mx[x]=max(mx[ls],val[x]+rp[ls]);}else{lp[x]=max(lp[ls],sum[ls]+val[x]+lp[rs]);rp[x]=max(rp[rs],sum[rs]+val[x]+rp[ls]);mx[x]=max(rp[ls]+val[x]+lp[rs],max(mx[ls],mx[rs]));}
}
void rrr(int x){rev[x]^=1;swap(ls,rs);swap(lp[x],rp[x]);
}
void pushdown(int x){if(tag[x]){tag[x]=rev[x]=0;if(ls){val[ls]=val[x];tag[ls]=1;sum[ls]=siz[ls]*val[x];}if(rs){val[rs]=val[x];tag[rs]=1;sum[rs]=siz[rs]*val[x];	}if(val[x]>=0){if(ls) mx[ls]=lp[ls]=rp[ls]=sum[ls];if(rs) mx[rs]=lp[rs]=rp[rs]=sum[rs];}else{if(ls){lp[ls]=rp[ls]=0;mx[ls]=sum[ls];}if(rs){lp[rs]=rp[rs]=0;mx[rs]=sum[rs];}}}if(rev[x]){rev[x]=0;if(ls) rrr(ls);if(rs) rrr(rs);}
}
void dfs1(int x){if(!x) return;pushdown(x);dfs1(ls);printf("%d ",val[x]);dfs1(rs);pushup(x);
}
void dfs2(int x){if(!x) return;pushdown(x);printf("x=%d val=%d ls=%d rs=%d siz=%d\n",x,val[x],ls,rs,siz[x]);dfs2(ls);dfs2(rs);pushup(x);
}
void debug(int f){printf("------r=%d\n",r);if(f==1) dfs1(r);else dfs2(r);printf("\n\n");
}
int New(int v,int fa){int x=fre[top--];val[x]=mx[x]=sum[x]=v;lp[x]=rp[x]=max(0,v);f[x]=fa;siz[x]=1;tag[x]=rev[x]=0;return x;
}
#define which(x) (tr[f[x]][1]==x)
void rotate(int x){int fa=f[x],gfa=f[fa];pushdown(gfa);pushdown(fa);pushdown(x);int k=which(x),son=tr[x][k^1];f[x]=gfa;if(gfa) tr[gfa][which(fa)]=x;f[fa]=x;tr[x][k^1]=fa;f[son]=fa;tr[fa][k]=son;pushup(fa);pushup(x);pushup(gfa);
}
void splay(int x,int goal){if(x==goal) return;for(int fa;(fa=f[x])!=goal;rotate(x)){if(f[fa]!=goal)which(x)==which(fa)?rotate(fa):rotate(x);}if(!goal) r=x;
}
int a[N];
int build(int l,int r,int fa){if(l>r) return 0;int mid=(l+r)>>1;int x=New(a[mid],fa);tr[x][0]=build(l,mid-1,x);tr[x][1]=build(mid+1,r,x);pushup(x);
//	printf("l=%d r=%d x=%d pl=%d siz=%d\n",l,r,x,mid,siz[x]);return x;
}
int find(int x,int k){pushdown(x);if(siz[ls]>=k) return find(ls,k);else if(siz[ls]+1==k) return x;else return find(rs,k-siz[ls]-1);
}
int split(int l,int rr){int a=find(r,l-1);splay(a,0);int b=find(r,rr+1);splay(b,a);return tr[b][0];
}
void add(int x,int k,int s){pushdown(x);tr[x][k]=s;f[s]=x;pushup(x);
}
char s[150];
void ins(){int pos=read(),tot=read();pos++;for(int i=1;i<=tot;i++) a[i]=read();int now=build(1,tot,0);if(pos==1){int x=find(r,1);splay(x,0);int y=find(r,2);splay(y,x);add(y,0,now);splay(y,0);return;}int x=split(pos,pos);add(x,1,now);pushup(x);splay(now,0);
}
void save(int x){if(!x) return;fre[++top]=x;save(ls);save(rs);
}
void del(){int pos=read(),tot=read();pos++;int x=split(pos,pos+tot-1),fa=f[x];save(x);tr[fa][0]=0;pushup(fa);splay(fa,0);
}
void same(){int pos=read(),tot=read(),v=read();pos++;int x=split(pos,pos+tot-1);val[x]=v;tag[x]=1;sum[x]=siz[x]*v;lp[x]=rp[x]=max(0,sum[x]);splay(x,0);
}
void reverse(){int pos=read(),tot=read();pos++;int x=split(pos,pos+tot-1);rrr(x);//printf("x=%d\n",x);debug(2);splay(x,0);
}
void getsum(){int pos=read(),tot=read();pos++;int x=split(pos,pos+tot-1);printf("%d\n",sum[x]);
}
void maxsum(){printf("%d\n",mx[r]);
}
int main(){for(int i=500050;i>=1;i--) fre[++top]=i;n=read();m=read();for(int i=1;i<=n;i++) a[i]=read();r=build(1,n,0);splay(find(r,1),0);add(r,0,New(-20000,r));splay(find(r,n+1),0);add(r,1,New(-20000,r));//debug(1);for(int i=1;i<=m;i++){//	printf("-------------------------------------\n");scanf(" %s",s+1);if(s[1]=='I') ins();else if(s[1]=='D') del();else if(s[3]=='K') same();else if(s[1]=='R') reverse();else if(s[1]=='G') getsum();else maxsum();//debug(1);}return 0;
}
/*
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAP 2.4版本发布,支持版本隔离特性

前言自从上次 CAP 2.3 版本发布 以来&#xff0c;已经过去了几个月的时间&#xff0c;这几个月比较忙&#xff0c;所以也没有怎么写博客&#xff0c;趁着2019年到来之际&#xff08;现在应该是2019年开始的时候&#xff09;&#xff0c;CAP也发布了2018年的最后一个大版本 2.4&…

【周末狂欢赛7】【NOIP模拟赛】七夕祭,齿轮(dfs),天才黑客

文章目录T1题目题解codeT2题目题解codeT3题目题解codeT1 题目 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是TYVJ今年举办了一次线下七夕祭。Vani同学今年成功邀请到了cl同学陪他来共度七夕&#xff0c;于是他们决定去TYVJ七夕祭游玩。 TYVJ七夕祭和11区的夏祭的…

.NET Core 如何为项目提供高性能解决方案?

本系列&#xff0c;我们将探讨.NET Core 的一些好处&#xff0c;以及它如何为市场提供高性能解决方案&#xff0c;为传统.NET 开发人员和技术人员提供帮助。正文前言随着.NET Core 2.0 在 2016 年首次发布&#xff0c;微软拥有了这个通用、模块化、跨平台开源项目的下一个主要版…

[2.9训练]【CF909C】Python Indentation,【CF909D】Colorful Points,【CF909E】Coprocessor

文章目录T1&#xff1a;Python Indentation题目题解codeT2&#xff1a;Colorful Points题目题解codeT3&#xff1a;Coprocessor题目题解codeT1&#xff1a;Python Indentation 题目 题目描述 In Python, code blocks don’t have explicit begin/end or curly braces to mark…

Docker最全教程之使用Tencent Hub来完成CI(十)

本周更新两篇&#xff0c;保证不太监&#xff01;在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、…

[2.7]【CF933A】A Twisty Movement【CF926B】Add Points【CF917A】The Monster【CF919E】Congruence Equation

文章目录T1&#xff1a;A Twisty Movement题目题解codeT2&#xff1a;Add Points题目题解codeT3&#xff1a;The Monster题目题解codeT4&#xff1a;Congruence Equation题目题解codeT1&#xff1a;A Twisty Movement 题目 题目 题解 因为aia_iai​1/21/21/2&#xff0c;于…

LIS最长上升子序列

LIS算是比较经典的问题&#xff0c;常用的是O(n^2)的方法 for(int i1;i<n;i){dp[i]1;for(int j1;j<i;j){if(a[j]<a[i])dp[i]max(dp[i],dp[j]1);}mxmax(mx,dp[i]);}我们这里优化成O(nlogn) 我们模拟一个栈stack&#xff0c;每读入一个数&#xff0c;如果这个数大于栈顶…

EF Core 数据库 Provider 一览

当 EF Core 1.x 系列和 2.0 版本之间经过重大的重写时&#xff0c;所有 EF Core 数据库 Provider 都受到重创。从那时起&#xff0c;各种私人和商业开发团队一直在努力填补这个空白。正文当 EF Core 1.x 系列和 2.0 版本之间经过重大的重写时&#xff0c;所有 EF Core 数据库 P…

[3.3训练赛]One-Dimensional(矩阵快速幂),Freda的迷宫(无向图强连通分量+并查集),一道防AK好题

文章目录T1:One-DimensionaltitlesolutioncodeT2:【NOIP模拟赛】Freda的迷宫titlesolutioncodeT3:【NOIP模拟赛】一道防AK好题titlesolutioncode确实没想到自己写文章能隔这么久&#xff0c;鸽王预警 T1:One-Dimensional title 考虑一个含有 N 个细胞的一维细胞自动机。细胞…

牛客网专题 概率dp

文章目录概念&#xff1a;例题引入&#xff1a;解答&#xff1a;Happy Running NC15532题意&#xff1a;题解&#xff1a;代码&#xff1a;poj2096 NC106693 Collecting Bugs题意&#xff1a;题解&#xff1a;代码&#xff1a;NC210477 带富翁题意&#xff1a;题解&#xff1a;…

.NET Core 3.0 特性初探:C# 8、WPF、Windows Forms、EF Core

.NET Core 的下一个主要版本最近进入了预览阶段&#xff0c;.NET Core 3.0 将支持使用 Windows Presentation Foundation &#xff08;WPF&#xff09;、Windows Forms&#xff08;WinForms&#xff09;、Entity Framework &#xff08;EF&#xff09;、Blazor、 C# 8 和.NET S…

YBTOJ洛谷P4074:糖果公园(树上莫队)

文章目录解析update:代码所谓树上莫队&#xff0c;就是在树上的莫队 &#xff08;逃&#xff09; 传送门 解析 似乎就是树上的这道题 考虑如何转化为序列问题呢? 考虑dfs序 但是又一个问题。。。 似乎这条链的dfs序不连续啊 树剖一下就好啦 考虑更阳间的方法 求出这棵树的欧…

【用梨泰院class中的财阀世家带你洞悉替罪羊树】Scapegoat Tree原理,模板,例题

我想写在前面&#xff0c;本文财阀世家全是虚构&#xff0c;没有诋毁之意&#xff0c;如有雷同&#xff0c;纯属巧合 红色预警&#xff01;&#xff01;&#xff01;红色预警 文章目录Scapegoat Tree概念模板变量声明Bad函数判断是否需要重构理解模板rebuild重构理解模板inser…

领域驱动设计,让程序员心中有码(五)

1 从搬砖谈领域对象有一个古老的故事&#xff0c;大概是这样的。作者问三个建筑工地上的工人他们在干什么&#xff1f;有一个没精打采的说&#xff0c;我在挖洞&#xff01;而另一一个人却说&#xff0c;我在盖一座房子。还有一个人说&#xff0c;我在建立一座巨大的城市。…

.NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理...

通过 ASP.NET Core&#xff0c;开发者可轻松配置和管理其应用的安全性。 ASP.NET Core 中包含管理身份验证、授权、数据保护、SSL 强制、应用机密、请求防伪保护及 CORS 管理等等安全方面的处理。 通过这些安全功能&#xff0c;可以生成安全可靠的 ASP.NET Core 应用。而我们这…

模板:左偏树

文章目录解析可以解决的问题定义&#xff1a;左偏树的基本性质基本结论操作合并访问与删除堆顶元素插入元素批量插入删除已知元素所谓左偏树&#xff0c;就是往左偏的树 下面介绍一下它的一个兄弟&#xff1a; 《右偏树》 &#xff08;逃&#xff09; 解析 所谓左偏树&#…

迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])

快速简单记录老师口胡&#xff08;可能就我自己看得懂了吧…&#xff09; 文章目录T1&#xff1a;舞踏会titlesolutioncodeT2&#xff1a;HH去散步titlesolutioncodeT3&#xff1a;排序titlesolutioncodeT4&#xff1a;铁路旅行titlesolutioncodeT1&#xff1a;舞踏会 title …

CSP2021提高组复赛解析

前言 终于出成绩了我可以写博客辣&#xff0c;官方数据还没出就先放洛谷的题目链接了。 正题 T1-廊桥分配 https://www.luogu.com.cn/problem/P7913 题目大意 有m1m_1m1​种一类飞机&#xff0c;m2m_2m2​种二类飞机&#xff0c;每个飞机有一个占用时间的区间。要给两类飞机…

一起开心集训队第一周训练赛2021/3/14

文章目录比赛链接A CodeForces 1481D AB Graph题意&#xff1a;题解&#xff1a;代码&#xff1a;B CodeForces 1481E Sorting Books题意&#xff1a;题解&#xff1a;代码&#xff1a;C CodeForces 1478D Nezzar and Board题意&#xff1a;题解&#xff1a;代码&#xff1a;D …

使用Azure DevOps持续集成GitHub项目

点击蓝字关注我微软的Azure DevOps是一款软件开发管理工具&#xff0c;整合了需求、代码、编译、测试、发布等所有功能于一身。今天我们就来看看如何用Azure DevOps对自己GitHub上的项目做持续集成&#xff0c;并能在GitHub显示最新编译状态。其实在不久之前&#xff0c;Azure …