BZOJ 3323 splay维护序列
来源:互联网 发布:删除表某一行的sql语句 编辑:程序博客网 时间:2024/05/21 06:27
就第三个操作比较新颖
转化成 在l前插一个点
把r和r+1合并
//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=100005,mod=20130426;typedef long long ll;struct Tree{ int fa,ch[2];ll add,mul,size,val;}tr[666666];int cnt,root,n,xx,yy,zz;ll ans,t,al;char op[10];void push_up(int x){ int lson=tr[x].ch[0],rson=tr[x].ch[1]; tr[x].size=tr[lson].size+tr[rson].size+1;}void push_down(int x){ if(!x||(tr[x].mul==1&&tr[x].add==0))return; int lson=tr[x].ch[0],rson=tr[x].ch[1]; ((tr[lson].add*=tr[x].mul)+=tr[x].add)%=mod; ((tr[rson].add*=tr[x].mul)+=tr[x].add)%=mod; ((tr[lson].val*=tr[x].mul)+=tr[x].add)%=mod; ((tr[rson].val*=tr[x].mul)+=tr[x].add)%=mod; (tr[lson].mul*=tr[x].mul)%=mod; (tr[rson].mul*=tr[x].mul)%=mod; tr[x].mul=1,tr[x].add=0;}int build(int l,int r,int father){ if(l>r)return 0; int pos=++cnt; tr[pos].size=1,tr[pos].fa=father,tr[pos].mul=1; if(l==r)return pos; int mid=(l+r)>>1; tr[pos].ch[0]=build(l,mid-1,pos); tr[pos].ch[1]=build(mid+1,r,pos); push_up(pos); return pos;}void rotate(int p){ int q=tr[p].fa,y=tr[q].fa,x=(tr[q].ch[1]==p); tr[q].ch[x]=tr[p].ch[!x];tr[tr[q].ch[x]].fa=q; tr[p].ch[!x]=q;tr[q].fa=p;tr[p].fa=y; if(y)tr[y].ch[tr[y].ch[1]==q]=p; push_up(q);}void splay(int x,int tp){ for(int y;y=tr[x].fa;rotate(x)){ if(y==tp)break; if(tr[y].fa!=tp){ if((tr[y].ch[0]==x)^(tr[tr[y].fa].ch[0]==y))rotate(x); else rotate(y); } }push_up(x); if(!tp)root=x;}void dfs(int x){ if(!x)return; push_down(x); dfs(tr[x].ch[0]); if(++al>0)(ans+=t*tr[x].val)%=mod,(t*=xx)%=mod; dfs(tr[x].ch[1]);}int find(int x,int sz){ push_down(x); if(tr[tr[x].ch[0]].size+1==sz)return x; else if(tr[tr[x].ch[0]].size>=sz)return find(tr[x].ch[0],sz); else return find(tr[x].ch[1],sz-tr[tr[x].ch[0]].size-1);}int main(){ scanf("%d",&n); root=build(0,maxn,0); while(n--){ scanf("%s",op); if(op[0]=='a'){ scanf("%d%d%d",&xx,&yy,&zz); int fx=find(root,xx+1),fy=find(root,yy+3); splay(fx,0),splay(fy,fx); (tr[tr[fy].ch[0]].add+=zz)%=mod,(tr[tr[fy].ch[0]].val+=zz)%=mod; push_up(fy),push_up(fx); } else if(op[3]=='x'){ scanf("%d%d",&xx,&yy); int fx=find(root,yy+1),fy=find(root,yy+4); splay(fx,0),splay(fy,fx); push_down(fx),push_down(fy),push_down(tr[fy].ch[0]); int now1=tr[fy].ch[0],now2=tr[now1].ch[0]+tr[now1].ch[1]; tr[now1].val+=tr[now2].val,tr[now1].size=1; tr[now2].fa=tr[now1].ch[0]=tr[now1].ch[1]=0; push_up(fy),push_up(fx); fx=find(root,xx+1),fy=find(root,xx+2); splay(fx,0),splay(fy,fx);tr[fy].ch[0]=++cnt; tr[cnt].size=1,tr[cnt].fa=fy,tr[cnt].mul=1; push_up(fy),push_up(fx); } else if(op[0]=='q'){ scanf("%d",&xx),ans=0,t=1,al=-1,dfs(root),printf("%lld\n",ans); } else{ scanf("%d%d%d",&xx,&yy,&zz); int fx=find(root,xx+1),fy=find(root,yy+3); splay(fx,0),splay(fy,fx); (tr[tr[fy].ch[0]].mul*=zz)%=mod,(tr[tr[fy].ch[0]].val*=zz)%=mod; (tr[tr[fy].ch[0]].add*=zz)%=mod,push_up(fy),push_up(fx); } }}
0 0
- BZOJ 3323 splay维护序列
- BZOJ 1251 Splay维护序列
- [LCT || splay维护括号序列] BZOJ 4573 [Zjoi2016]大森林
- noi2005 维护序列。 splay
- 【BZOJ 1798】维护序列
- BZOJ 1798, 维护序列
- BZOJ 1500 维修序列 Splay
- BZOJ 3729 splay维护DFS序+博弈论
- [BZOJ1798]AHOI2009 维护序列|线段树|splay
- 【学习小记】用splay维护序列
- splay维护序列——模板整理
- CF414E,splay维护括号序列,码农题
- 【bzoj 1798】[AHOI2009]维护序列
- BZOJ 1798 维护序列 seq
- BZOJ 1251 序列终结者 Splay
- BZOJ 1251 序列终结者 Splay
- BZOJ 1251 序列终结者 Splay
- 【splay】BZOJ 1251 序列终结者
- 换个体位 豁然开朗 --- Jump Game &&Best Time to Buy and Sell Stock VI
- Atitit 项目源码的架构,框架,配置与环境说明模板 规范 标准化
- CSDN-markdown编辑器的使用
- 设计模式笔记二十:观察者模式 |更新版
- [LeetCode]419. Battleships in a Board
- BZOJ 3323 splay维护序列
- 10018---Lua安装
- 工具类-Tool
- 在Eclipse配置Tomcat服务器
- 端口个数为什么是65535个?
- 模板方法设计模式
- [iOS]iOS结合OpenCV做视频流处理或人脸识别
- 123
- 怎么判断N!的阶乘末尾有几个零