转啊转终于转出来了,然而我的模板跟陈竞潇学长的模板一模一样,还是太弱啊,第一次用指针。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define for1(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
typedef long long ll;
const int N=1E5+;
int n,m,data[N];
struct node{
node();
node *ch[],*fa;
ll d,sum,set,add[]; int size; short vset;
short pl() {return this==fa->ch[];}
void count(); void push();
void mark(ll,ll,short);
}*null;
node::node(){ch[]=ch[]=fa=null; size=vset=sum=add[]=add[]=;}
void node::mark(ll val,ll dd,short t){
if(this==null) return;
if(!t){
set=val;
sum=size*set;
d=set;
vset=;
add[]=add[]=;
}else{
add[]+=val;
add[]+=dd;
sum+=val*size;
sum+=dd*size*(size-)/;
d+=val+dd*(ch[]->size);
}
}
void node::push(){
if(this==null)return;
if(vset){
ch[]->mark(set,,);
ch[]->mark(set,,);
vset=; set=;
}
if(add[]||add[]){
ch[]->mark(add[],add[],);
ch[]->mark(add[]+add[]*(ch[]->size+),add[],);
add[]=add[]=;
}
}
void node::count(){
size=ch[]->size+ch[]->size+;
sum=ch[]->sum+ch[]->sum+d;
}
namespace Splay{
node *ROOT;
node *build(int l=,int r=n){
if (l>r) return null;
int mid=(l+r)>>;
node *ro=new node;
ro->d=data[mid];
ro->ch[]=build(l,mid-);
ro->ch[]=build(mid+,r);
ro->ch[]->fa=ro;
ro->ch[]->fa=ro;
ro->count();
return ro;
}
void Build(){
null=new node;
*null=node();
ROOT=build();
}
void rotate(node *k){
node *r=k->fa; if (k==null||r==null) return;
r->push(); k->push();
int x=k->pl()^;;
r->ch[x^]=k->ch[x];
r->ch[x^]->fa=r;
if (r->fa!=null) r->fa->ch[r->pl()]=k;
else ROOT=k;
k->fa=r->fa; r->fa=k;
k->ch[x]=r;
r->count(); k->count();
}
void splay(node *r,node *tar=null){
for (;r->fa!=tar;rotate(r))
if (r->fa->fa!=tar)rotate(r->pl()==r->fa->pl()?r->fa:r);
r->push();
}
void insert(int x,int val){
node *r=ROOT;
if (ROOT==null){
ROOT=new node;
ROOT->d=val;
ROOT->count();
return;
}
while ()
{
r->push();
int c;
if (r->ch[]->size+>=x) c=;
else c=,x-=r->ch[]->size+;
if (r->ch[c]==null){
r->ch[c]=new node;
r->ch[c]->fa=r;
r->ch[c]->d=val;
splay(r->ch[c]);
return;
}else r=r->ch[c];
}
}
node *kth(int k){
node *r=ROOT;
while (r!=null){
r->push();
if (r->ch[]->size>=k) r=r->ch[];
else if (r->ch[]->size+>=k) return r;
else k-=r->ch[]->size+,r=r->ch[];
}
return null;
}
node *pack(int l,int r){
node *ln=kth(l-),*rn=kth(r+);
if ((ln==null)&&(rn==null)) return ROOT;
else if (ln==null){
splay(rn); return rn->ch[];
}else if (rn==null){
splay(ln); return ln->ch[];
}else{
splay(ln); splay(rn,ROOT);
return rn->ch[];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for1(i,,n)scanf("%d",&data[i]);
Splay::Build(); int j,a,b,c;
for1(i,,m){
scanf("%d",&j);
switch(j){
node *r;
case :
scanf("%d%d%d",&a,&b,&c);
r=Splay::pack(a,b);
r->mark(c,,);
Splay::splay(r);
break;
case :
scanf("%d%d%d",&a,&b,&c);
r=Splay::pack(a,b);
r->mark(c,c,);
Splay::splay(r);
break;
case :
scanf("%d%d",&a,&b);
Splay::insert(a,b);
break;
case :
scanf("%d%d",&a,&b);
r=Splay::pack(a,b);
printf("%lld\n",r->sum);
break;
}
}
return ;
}

【BZOJ 3188】【Coci 2011】Upit Splay模板题的更多相关文章

  1. Dbzoj#3188. [Coci 2011]Upit

    写道数据结构练练手哈哈哈 // It is made by XZZ #include<cstdio> #include<algorithm> #include<cstdl ...

  2. BZOJ3188: [Coci 2011]Upit

    3188: [Coci 2011]Upit Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 24[Submit][Status] ...

  3. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  4. bzoj 1588 splay模板题

    用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...

  5. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  6. bzoj 3224 splay模板题4

    再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...

  7. bzoj 3223 splay模板题3

    水题...貌似理解splay怎么维护数列了... 每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树. #include<i ...

  8. bzoj 1208 splay模板题2

    自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...

  9. BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题

    题目: 洛谷也能评 题解: 记录一下当前树维护是宠物还是人,用Splay维护插入和删除. 对于任何一次询问操作都求一下value的前驱和后继(这里前驱和后继是可以和value相等的),比较哪个差值绝对 ...

随机推荐

  1. java分别通过httpclient和HttpURLConnection获取图片验证码内容

    前面的文章,介绍了如何通过selenium+Tesseract-OCR来识别图片验证码,如果用接口来访问的话,再用selenium就闲的笨重,下面就介绍一下分别通过httpclient和HttpURL ...

  2. 写一个ActionFilter检测WebApi接口请求和响应

    我们一般用日志记录每次Action的请求和响应,方便接口出错后排查,不过如果每个Action方法内都写操作日志太麻烦,而且客户端传递了错误JSON或XML,没法对应强类型参数,请求没法进入方法内, 把 ...

  3. HDU 5029 Relief grain --树链剖分第一题

    题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种. 解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉 ...

  4. 第11章 Windows线程池(3)_私有的线程池

    11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...

  5. VS 扩展推荐

    Visual Studio 工欲善其事,必先利器.本着这样的观念,对于经常使用的工具,我喜欢去研究研究,帮助我提高效率. Visual Studio Microsoft Visual Studio(简 ...

  6. dalvik

    Google公司自己设计用于Android平台的Java虚拟机

  7. 【转】PHP date("Y-m-d H:i:s");获取当前时间 差8小时解决办法

    原因:                                                                                              网络资 ...

  8. 虚拟现实的三维时态GIS模式研究

  9. INADDR_ANY的确切含义

    INADDR_ANY就是inet_addr("0.0.0.0") 首先,需要明确的是当服务器的监听地址是INADDR_ANY时设置的是服务器的IP地址. 其次,当服务器的监听地址是 ...

  10. [CareerCup] 11.6 Search a 2D Matrix 搜索一个二维矩阵

    11.6 Given an M x N matrix in which each row and each column is sorted in ascending order, write a m ...