非旋转式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. css3中的变换、动画和过渡

    变换:分为2d变换和3d变换,但一次只能用一个变换属性,多个的话最后一个会覆盖前面所有最终被浏览器实现,变换可以成为过渡和动画的一个待变参数(类似width,opacity等). 过渡:是动画的初始模 ...

  2. iOS Programming Localization 本地化

    iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...

  3. 5.4QBXT 模拟赛 (Rank1 机械键盘 蛤蛤)

    NOIP2016提高组模拟赛 ——By wangyurzee7 中文题目名称 纸牌 杯具 辣鸡 英文题目与子目录名 cards cups spicychicken 可执行文件名 cards cups ...

  4. Bash Template

    #/bin/bash #set -x set -e usage() { cat <<EOF Usage: `basename $` [OPTIONS] <non-option arg ...

  5. .Net Core 真能令微软的.Net 跨平台“蔓延”?

    什么是.Net .Net 本身就是基于公共语言基础架构(CLI)实现的平台独立的公共语言开发平台,只是自2006年成为规范以来的CLI,只有Windows自己支持罢了(mono除外).微软的.Net ...

  6. C++学习随笔

    今天试着变了下实验二里边的有关面向对象的实验,深深地觉得我对面向对象的编程的理解还是很浅显,以至于对于对象的调用也是瞎整.居然直接就去调用继承来的函数,连生成一个对象这种基础应用都不知道.对自己的基础 ...

  7. 谈谈如何来查看GC日志

    一.首先来看一下JVM中的GC有哪几种类型? 1.-XX:UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后,使用Serial+Serial Old收集器组合进行垃圾收集. ...

  8. HTML head meta标签详细

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...

  9. java图片放大或缩小

    package org.jimmy.autotranslate20181022.utils; import java.awt.Graphics; import java.awt.image.Buffe ...

  10. 关于Maven项目的pom.xml中的依赖或插件失效的解决方法

    1.请将<dependency>标签包含的依赖从<dependencyManagement>中拿出来,单独放在<dependencies>标签里面.2.请将< ...