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

#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. 【ASP.NET 进阶】无刷新上传图片之一:利用一般处理程序

    效果图: 源代码地址:https://github.com/YeXiaoChao/UploadThePic

  2. 二分+动态规划 POJ 1973 Software Company

    Software Company Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1112   Accepted: 482 D ...

  3. 怪物彈珠Monster Strike 攻略

    火>水>木>光>暗 1.每天的曜日素材本,周一暗光,周二火,周参水,周四木,周五光乌龟,都是可以打整天的 2.另外补充,升经验用暗乌龟,切忌切记要塞给他随便一只烂宠升等,再吃掉 ...

  4. C++ 基础笔记(一)

    解释型和编译型 解释型: 边解释边执行,翻译成机器代码后就执行. 编译型: 整篇代码编译成机器码后,保存在可执行文件中,然后启动该程序文件,运行获得结果. Hello World #include & ...

  5. Unity3D面试题汇总

    1.请描述游戏动画有哪几种,以及其原理. 2.alpha blend 工作原理 3.写光照计算中的diffuse的计算公式 4.lod是什么,优缺点是什么 5.两种阴影判断的方法工作原理 6.MipM ...

  6. 通过Nethogs查看服务器网卡流量情况

    在日常运维工作中,会碰到服务器带宽飙升致使网站异常情况.作为运维人员,我们要能非常清楚地了解到服务器网卡的流量情况,观察到网卡的流量是由哪些程序在占用着. 今天介绍一款linux下查看服务器网卡流量占 ...

  7. CentOS 7 添加win7启动项——修改默认启动项

    CentOS 7使用grub2引导启动,在win7之后装完CentOS再启动会丢失win7启动项. 首先,添加win7启动项,步骤如下: 1.使用root登陆系统 2.用文本编辑器打开 /boot/g ...

  8. MVC中利用ActionFilterAttribute过滤关键字

    在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性.屏蔽的方法有很多种,但是今天我说的这种主要是利用MVC中的ActionFilterAttribute属性来实现.由于MVC天然支持AOP ...

  9. [CareerCup] 13.7 Node Pointer 节点指针

    13.7 Write a method that takes a pointer to a Node structure as a parameter and returns a complete c ...

  10. 教你怎么fan qiang 进国内看视频而不受限制

    这一周难得今天闲一点,写日志也不知道写啥,谈爱情?...没得谈.思前想后还是在这儿带给大家点福利吧,主要是针对在国外生活的孩纸们看国内视频总是提示被限制的问题,qq音乐也是.     或许大家有听过f ...