非旋转式Treap1500 :)

 #include <bits/stdc++.h>
#pragma GCC optimize(3) using namespace std; const int INF=0x3f3f3f3f; struct node
{
int val,key,size;
int sum,lx,rx,mx,revf,chgf;
node *l,*r;
node() { }
node(const int x)
{
mx=val=sum=x; key=rand();
size=; lx=rx=(x>?x:);
chgf=INF; revf=; l=r=;
} void push_down()
{
if(chgf!=INF)
{
sum=chgf*size;
val=chgf;
lx=rx=(chgf>=?sum:);
mx=(chgf>=?sum:chgf);
if(l) l->chgf=chgf;
if(r) r->chgf=chgf;
chgf=INF; revf=;
}
if(revf)
{
if(l)l->revf^=;
if(r)r->revf^=;
swap(l,r);
swap(lx,rx);
revf=;
} return ;
} void update()
{
if(l)l->push_down();
if(r)r->push_down();
sum=(l?l->sum:)+(r?r->sum:)+val;
size=(l?l->size:)+(r?r->size:)+;
mx=max(max((l?l->mx:-INF),(r?r->mx:-INF)),
(l?l->rx:)+(r?r->lx:)+val);
lx=max((l?l->lx:), (l?l->sum:)+val+(r?r->lx:));
rx=max((r?r->rx:), (r?r->sum:)+val+(l?l->rx:));
return ;
} }U[],*Trash[],*ALL=U; int top; node * ALLOC(const int x)
{
return new(top?Trash[top--]:++ALL)node(x);
} void RECYCLE(node * t)
{
if(!t)return ;
RECYCLE(t->l);
RECYCLE(t->r);
Trash[++top]=t;
return ;
} struct Treap
{
typedef pair<node *,node *> PNN;
public:
Treap() { root=; } private: node * root; node * merge(node * t1,node * t2)
{
if(!t1) return t2; if(!t2) return t1;
t1->push_down(); t2->push_down();
if(t1->key < t2->key)
return t1->r=merge(t1->r,t2),t1->update(),t1;
return t2->l=merge(t1,t2->l),t2->update(),t2;
} PNN split(node * t,const int pos)
{
if(t) t->push_down();
if(!t) return make_pair((node*),(node*));
if(!pos) return make_pair((node*),t);
if(t->l && t->l->size==pos)
{
node * temp=t->l;
return t->l=,t->update(),make_pair(temp,t);
}
if(t->l && t->l->size+==pos)
{
node * temp=t->r;
return t->r=,t->update(),make_pair(t,temp);
}
if(t->l && t->l->size>pos)
{
PNN temp=split(t->l,pos);
return t->l=temp.second,t->update(),
make_pair(temp.first,t);
}
if(!t->r) return make_pair(t,(node*));
PNN temp=split(t->r,pos-(t->l?t->l->size:)-);
return t->r=temp.first,t->update(),make_pair(t,temp.second);
} node * build(const int * A,const int N)
{
stack<node *> stk; node * temp=;
for(int i=;i<N;++i)
{
node * t=ALLOC(A[i]);
while(!stk.empty() && t->key<stk.top()->key)
temp=stk.top(),temp->update(),stk.pop();
if(!stk.empty())
{
t->l=stk.top()->r;
t->update();
stk.top()->r=t;
stk.top()->update();
stk.push(t);
}
else
{
t->l=temp;
t->update();
stk.push(t);
}
}
while(!stk.empty()) temp=stk.top(),temp->update(),stk.pop();
return temp;
} public:
void insert(const int pos,const int * A,const int N)
{
PNN t=split(root,pos);
t.first=merge(t.first,build(A,N));
root=merge(t.first,t.second);
return ;
} void erase(const int l,const int r)
{
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
RECYCLE(t2.first);
root=merge(t1.first,t2.second);
} void make_same(const int l,const int r,const int d)
{
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
t2.first->chgf=d;
t2.first->push_down();
root=merge(t1.first,merge(t2.first,t2.second));
} void reverse(const int l,const int r)
{
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
t2.first->revf^=;
t2.first->push_down();
root=merge(t1.first,merge(t2.first,t2.second));
} int get_sum(const int l,const int r)
{
if(l>r)return ;
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
t2.first->push_down();
int temp=t2.first->sum;
root=merge(t1.first,merge(t2.first,t2.second));
return temp;
} int max_sum()
{
PNN t1=split(root,);
PNN t2=split(t1.second,root->size);
t2.first->push_down();
int temp=t2.first->mx;
root=merge(t1.first,merge(t2.first,t2.second));
return temp;
}
}S; int n,m,x,y,z;
int a[];
char op[]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;++i) scanf("%d",&a[i]);
S.insert(,a,n);
while(m--)
{
scanf("%s",op);
if(op[]=='S') // Insert
{
scanf("%d%d",&x,&y);
for(int i=;i<y;++i) scanf("%d",&a[i]);
S.insert(x,a,y);
}
if(op[]=='L') // Delete
{
scanf("%d%d",&x,&y);
S.erase(x,x+y-);
}
if(op[]=='K') // Make_same
{
scanf("%d%d%d",&x,&y,&z);
S.make_same(x,x+y-,z);
}
if(op[]=='V') // Reverse
{
scanf("%d%d",&x,&y);
S.reverse(x,x+y-);
}
if(op[]=='T') // Get_sum
{
scanf("%d%d",&x,&y);
printf("%d\n",S.get_sum(x,x+y-));
}
if(op[]=='X') // Max_sum
{
printf("%d\n",S.max_sum());
}
} return ;
}

[bzoj1500][NOI2005]维修数列[Treap][可持久化Treap]的更多相关文章

  1. [bzoj1500][NOI2005]维修数列_非旋转Treap

    维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...

  2. 2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)

    传送门 平衡树好题. 我仍然是用的fhqtreap,感觉速度还行. 维护也比线段树splay什么的写起来简单. %%%非旋treap大法好. 代码: #include<bits/stdc++.h ...

  3. [BZOJ1500][NOI2005]维修数列---解题报告

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  4. [BZOJ1500][NOI2005]维修数列 解题报告 Splay

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  5. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

  6. splay模板三合一 luogu2042 [NOI2005]维护数列/bzoj1500 [NOI2005]维修数列 | poj3580 SuperMemo | luogu3391 【模板】文艺平衡树(Splay)

    先是维修数列 题解看这里,但是我写的跑得很慢 #include <iostream> #include <cstdio> using namespace std; int n, ...

  7. BZOJ1500[NOI2005]维修数列——非旋转treap

    题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 输入 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初 ...

  8. BZOJ1500[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  9. BZOJ1500 [NOI2005]维修数列-fhq_Treap

    题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 ...

随机推荐

  1. 2016/10/29 Action类中execute方法的使用

    第一步:先配置web.xml文件 <filter> <filter-name>struts2</filter-name> <filter-class>o ...

  2. jquery readio checked

    今天太鬼火了为这个难问题搜了一下午了到最后还是csdn的朋友给了我正确的答案http://bbs.csdn.net/topics/300162450谢谢这位朋友 // $("#ISOK1&q ...

  3. 学习笔记 第十章 使用CSS美化表单

    第10章   使用CSS美化表单 [学习重点] 正确使用各种表单控件 熟悉HTML5新增的表单控件 掌握表单属性的设置 设计易用性表单页面 10.1  表单的基本结构 表单包含多个标签,由很多控件组成 ...

  4. 【Python】第一个爬虫

    import urllib.request import re class DownPic: def __init__(self,url,re_str): self.url = url self.re ...

  5. spark 学习路线及参考课程

    一.Scala编程详解: 第1讲-Spark的前世今生 第2讲-课程介绍.特色与价值 第3讲-Scala编程详解:基础语法 第4讲-Scala编程详解:条件控制与循环 第5讲-Scala编程详解:函数 ...

  6. 6 Specialzed layers 特殊层 第一部分 读书笔记

    6 Specialzed layers 特殊层  第一部分  读书笔记   Specialization is a feature of every complex organization. 专注是 ...

  7. apache设置无缓存

    打开httpd.conf 开启扩展 确保开启 LoadModule headers_module modules/mod_headers.so 添加配置项 并添加以下配置,跟据文件类型来让浏览器每次都 ...

  8. sql server查看某个表上的触发器

    用企业管理器查看 在某个具体的表上点右键->“所有任务”->“管理触发器”,选择所要查看的触发器

  9. ubuntu设置root账号密码

    Ubuntu Linux有一个与众不同的特点,那就是初次使用时,你无法作为root来登录系统,为什么会这样?这就要从系统的安装说起.对于其他Linux系统来 说,一般在安装过程就设定root密码,这样 ...

  10. java调用jacob生成pdf,word,excel横向

    /* * 传进一个office文件的byte[]以及后缀,生成一个pdf文件的byte[] */ public byte[] jacob_Office2Pdf(byte[] srcFileBytes, ...