1500: [NOI2005]维修数列

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 15112  Solved: 4996
[Submit][Status][Discuss]

Description

Input

输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。
第2行包含N个数字,描述初始时的数列。
以下M行,每行一条命令,格式参见问题描述中的表格。
任何时刻数列中最多含有500 000个数,数列中任何一个数字均在[-1 000, 1 000]内。
插入的数字总数不超过4 000 000个,输入文件大小不超过20MBytes。

Output

对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次打印结果,每个答案(数字)占一行。

Sample Input

9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM
INSERT 8 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM

Sample Output

-1
10
1
10

HINT

题解

非常恶心的一道题。。。

用fhq Treap完成的话

1、把原有的平衡树从pos处拆开,把新加的点新建一颗小平衡树合并进去

2、把原有平衡树从pos和pos+num处拆开,合并左右中间不要【但是记得回收下标】

3、把原有平衡树从pos和pos+num处拆开,在中间打上标记cov

4、把原有平衡树从pos和pos+num处拆开,在中间打上标记mark

5、把原有平衡树从pos和pos+num处拆开,输出sum[中间]

6、输出ma[rt];

【注意fhq Treap的lazy标记和线段树的不一样,线段树的标记是标而不改,fhq Treap是标时即改,不然在split和merge时可能不会改变之前标记的根节点】

注:spli是我校大神,用函数名调戏一下他hhh

代码

//by 减维
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<map>
#include<bitset>
#include<algorithm>
#define inf 1<<30
#define ll long long
using namespace std; int n,m,rt,sz,siz[],son[][],val[],lm[],rm[],ma[],sum[],mark[],cov[],pri[];
int a[];
char ch[];
queue<int>q; int newnode(int v)
{
int x;
if(!q.empty())
x=q.front(),q.pop();
else x=++sz;
siz[x]=;
son[x][]=son[x][]=mark[x]=;
cov[x]=inf;pri[x]=rand();
val[x]=sum[x]=ma[x]=v;
lm[x]=rm[x]=v;
return x;
} void upda(int x)
{
if(!x)return ;
siz[x]=siz[son[x][]]+siz[son[x][]]+;
sum[x]=sum[son[x][]]+sum[son[x][]]+val[x];
ma[x]=max(max(,rm[son[x][]])+val[x]+max(,lm[son[x][]]),max(ma[son[x][]],ma[son[x][]]));
lm[x]=max(lm[son[x][]],sum[son[x][]]+val[x]+max(,lm[son[x][]]));
rm[x]=max(rm[son[x][]],sum[son[x][]]+val[x]+max(,rm[son[x][]]));
} void covered(int x,int v)
{
val[x]=v;
sum[x]=siz[x]*v;
lm[x]=rm[x]=max(,sum[x]);
ma[x]=max(sum[x],val[x]);
cov[x]=v;
} void zhuan(int now)
{
swap(son[now][],son[now][]);
swap(lm[now],rm[now]);
mark[now]^=;
} void pd(int now)
{
if(mark[now]){
if(son[now][])zhuan(son[now][]);
if(son[now][])zhuan(son[now][]);
}
if(cov[now]!=inf){
if(son[now][])covered(son[now][],cov[now]);
if(son[now][])covered(son[now][],cov[now]);
}
mark[now]=;cov[now]=inf;
} int build(int l,int r)
{
if(l>r)return ;
int mid=(l+r)>>,v=a[mid];
int now=newnode(v);
son[now][]=build(l,mid-);
son[now][]=build(mid+,r);
upda(now);
return now;
} void dfs(int now)
{
if(!now)return;
dfs(son[now][]);
printf("%d ",val[now]);
dfs(son[now][]);
} void spli(int now,int k,int &x,int &y)
{
if(!now)x=y=;
else{
pd(now);
if(k<=siz[son[now][]])
y=now,spli(son[now][],k,x,son[now][]);
else
x=now,spli(son[now][],k-siz[son[now][]]-,son[now][],y);
upda(now);
}
} int merge(int x,int y)
{
if(!x||!y)return x+y;
pd(x),pd(y);
if(pri[x]<pri[y])
{
son[x][]=merge(son[x][],y);
upda(x);
return x;
}else{
son[y][]=merge(x,son[y][]);
upda(y);
return y;
}
} void rudui(int x)
{
if(!x)return ;
q.push(x);
rudui(son[x][]);
rudui(son[x][]);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d",&a[i]);
sum[]=siz[]=mark[]=cov[]=;
ma[]=val[]=-inf;
rt=build(,n);
int pos,num,x,y,z,k,b,c,d;
for(int i=;i<=m;++i)
{
//dfs(rt);printf("\n");
scanf("%s",ch+);
if (ch[]=='I'){
scanf("%d %d",&pos,&num);
for(int i=;i<=num;++i)scanf("%d",&a[i]);
z=build(,num);
spli(rt,pos,x,y);
rt=merge(merge(x,z),y);
}else if (ch[]=='D'){
scanf("%d%d",&pos,&num);
spli(rt,pos-,x,y);
spli(y,num,b,c);
rt=merge(x,c);
rudui(b);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}else if (ch[]=='M' && ch[] =='K'){
scanf("%d%d%d",&pos,&num,&k);
spli(rt,pos-,x,y);
spli(y,num,b,c);
covered(b,k);
rt=merge(x,merge(b,c));
}else if (ch[]=='R'){
scanf("%d%d",&pos,&num);
spli(rt,pos-,x,y);
spli(y,num,b,c);
zhuan(b);
rt=merge(x,merge(b,c));
}else if (ch[]=='G'){
scanf("%d%d",&pos,&num);
spli(rt,pos-,x,y);
spli(y,num,b,c);
printf("%d\n",sum[b]);
rt=merge(x,merge(b,c));
}else{
printf("%d\n",ma[rt]);
}
}
return ;
}

【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)的更多相关文章

  1. 【Splay】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 15112  Solved: 4996[Submit][Statu ...

  2. 边工作边刷题:70天一遍leetcode: day 89

    Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...

  3. 简析平衡树(四)——FHQ Treap

    前言 好久没码过平衡树了! 这次在闪指导的指导下学会了\(FHQ\ Treap\),一方面是因为听说它可以可持久化,另一方面则是因为听说它是真的好写. 简介 \(FHQ\ Treap\),又称作非旋\ ...

  4. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  5. FHQ Treap及其可持久化与朝鲜树式重构

    FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种 ...

  6. BZOJ 1500 [NOI2005]维修数列 FHQ Treap

    终于A了这题...这题还是很好...但是我太菜...重构了三遍qwq FHQ Treap大法好!qwq...~~ Ins:直接拿输入造一棵树,把原来的树split成[1,pos],[pos+1,n], ...

  7. 并不对劲的fhq treap

    听说很对劲的太刀流不止会splay一种平衡树,并不对劲的片手流为了反驳他,并与之针锋相对,决定学学高端操作. 很对劲的太刀流-> 据说splay常数极大,但是由于只知道splay一种平衡树能对序 ...

  8. [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap)

    [BZOJ1074] [luogu 4036] [JSOI 2008] 火星人 (二分答案+哈希+fhq treap) 题面 给出一个长度为n的字符串,m个操作,字符串仅包含小写英文字母 操作1:在k ...

  9. 【数据结构】FHQ Treap详解

    FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是 ...

随机推荐

  1. duilib 快捷键发送消息

    全局快捷键设置类,文章最以下,有3种不同的使用方法(假设设置的快捷键,与其它软件的快捷键同样.那么仅仅有你的程序起作用.你释放后它才干够使用) .h文件 #pragma once class CHot ...

  2. C++学习笔记24,方法重写与方法隐藏

    该博文仅用于交流学习.请慎用于不论什么商业用途.本博主保留对该博文的一切权利. 博主博客:http://blog.csdn.net/qq844352155 转载请注明出处: 方法重写.是指在子类中又一 ...

  3. Docker for Windows 使用入门

    欢迎来到Docker for Windows! Docker是用于创建Docker应用程序的完整开发平台,Docker for Windows是在Windows系统上开始使用Docker的最佳方式. ...

  4. 自学Python2.5-基本数据类型-set集合

    Python set集合 一. set集合概述 ①set集合,是一个无序且不重复的元素集合.②集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键.③集合支持用in和not in操作符检查成员 ...

  5. 利用AndroidStudio开发java工程

    1.新建一个project,或者如果你已经有project的话,那就直接新建一个module.注意选择Java library,然后下一步. 2.输入module的一些信息.点击finish.(在创建 ...

  6. JavaScript数字例子,二分法,冒泡排序

    先看一下两个例子: 十个成绩,求总分,最高分,最低分 //输入10个成绩,求总分,最高,最低 var arr=new Array(67,45,56,12,90,98,23,43,56,99,97); ...

  7. php-迭代创建级联目录

    方法一代码: path = './a/b/c/d/e/f'; $path_arr = explode('/',$path);//得到数组array('.','a','b','c','d','e','f ...

  8. Wamp环境搭建常见错误问题解决

    第一点.对于apache + php + mysql 的版本的正确选择 问题:网上有些教学视频已经很早了,然后很多人照着来,完全和视频里讲的一样,但是结果就是搭建不成功. 出现问题原因:三件套的版本选 ...

  9. JFinal极速开发框架使用笔记

    记录第一次使用JFinal,从简单的框架搭建到增删改查,从自带的方法到正常框架习惯的使用方式. JFinal官网:http://www.jfinal.com/ JFinal 是基于 Java 语言的极 ...

  10. Selinux安全机制

    1.Selinux安全机制简介 Selinux是Google在Android 4.4上正式推出的一套以SELinux为基础于核心的系统安全机制.而SELinux则是由美国NSA(国安局)和一些公司(R ...