洛谷 P3372 线段树模板
来源:互联网 发布:banner轮播js代码 编辑:程序博客网 时间:2024/06/05 08:30
【分析】
splay搞yeah
【代码】
//线段树板子(splay复习) #include<iostream>#include<cstring>#include<cstdio>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=100005;ll n,m,sz,root,k;int ch[mxn][2],f[mxn],size[mxn];ll key[mxn],sum[mxn],add[mxn],a[mxn];inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}inline int get(int x){ if(ch[f[x]][1]==x) return 1;return 0;}inline void update(int x){ size[x]=size[ch[x][0]]+size[ch[x][1]]+1; sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+key[x];}inline void ADD(int x,ll ad){ add[x]+=ad,key[x]+=ad; sum[x]+=ad*size[x];}inline void pushdown(int x){ if(x && add[x]) { if(ch[x][0]) ADD(ch[x][0],add[x]); if(ch[x][1]) ADD(ch[x][1],add[x]); add[x]=0; }}inline void rotate(int x){ pushdown(x); int fa=f[x],fafa=f[fa],which=get(x); ch[fa][which]=ch[x][which^1],f[ch[fa][which]]=fa; ch[x][which^1]=fa,f[fa]=x; f[x]=fafa; if(fafa) ch[fafa][ch[fafa][1]==fa?1:0]=x; update(fa),update(x);}inline void splay(int x,int lastfa){ for(int fa;(fa=f[x])!=lastfa;rotate(x)) if(f[fa]!=lastfa) rotate(get(x)==get(fa)?fa:x); if(!lastfa) root=x;}inline int number(int x){ int now=root; while(1) { pushdown(now); if(x<=size[ch[now][0]] && ch[now][0]) now=ch[now][0]; else { if(x==size[ch[now][0]]+1) return now; x=x-size[ch[now][0]]-1; now=ch[now][1]; } }}inline int build(int fa,int l,int r){ if(l>r) return 0; int now=++sz,mid=l+r>>1; f[now]=fa,key[now]=sum[now]=a[mid],size[now]=1; ch[now][0]=build(now,l,mid-1); ch[now][1]=build(now,mid+1,r); update(now); return now;}int main(){ int i,j,x,y,opt; scanf("%lld%lld",&n,&m); fo(i,2,n+1) scanf("%lld",&a[i]); root=build(0,1,n+2); fo(i,1,m) { opt=read(); if(opt==1) { scanf("%d%d%lld",&x,&y,&k);x++,y++; x=number(x-1),y=number(y+1); splay(x,0),splay(y,x); ADD(ch[y][0],k); } if(opt==2) { scanf("%d%d",&x,&y);x++,y++; x=number(x-1),y=number(y+1); splay(x,0),splay(y,x); printf("%lld\n",sum[ch[y][0]]); } } return 0;}
1 0
- 洛谷 P3372 线段树模板
- 【洛谷P3372】【模板】线段树 1
- 洛谷 P3372【模板】线段树 1
- 洛谷P3372 【模板】线段树 1
- 洛谷 P3372 【模板】线段树 1
- 【洛谷P3372】【模板】线段树1
- [P3372][模板]线段树1
- 【洛谷】P3372线段树1 线段树模板
- 洛谷P3372线段树模板1(改段求段)
- 洛谷P3372 【模板】线段树 1(lazy)
- 洛谷p3372 线段树模版
- Luogu-P3372 (Lazy_tag 线段树模板)
- 【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3372线段树1)
- 【模板】线段树 区间加,区间求和 (模板题:P3372线段树1)
- 洛谷 P3372 线段树 1(树状数组做法)
- 关于 线段树 下传(AC) 不做标记 下传(T3)模板洛谷p3372
- 【模板】线段树 洛谷 3372 线段树
- ACM 线段树模板(模板)
- iOS JavaScriptCore框架 入门
- React Native 基础 之ListView实现吸顶效果
- 移动web开发中 ios不兼容fixed
- nyoj 32 组合数
- 关联容器
- 洛谷 P3372 线段树模板
- SQL 事务 begin tran、commit tran、rollback tran 的用法
- org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
- MVP开发模式学习记录
- JMeter的使用
- Eclipse 的 jsp 页面代码格式化
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
- iOS从服务器加载字体文件和使用字体
- 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一