传送门

debug到死2333.

虽然说是splay维护序列模板,作为蒟蒻的我还是GG

%%%考场A的dalao Orz  Orz.

其实不开long long也行,inf开成0x3f3f3f3f也可(flag,欢迎推翻)

就当存个板子吧.

#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<vector>
#include<iostream>
#define ll long long
#define re register
#define inf 0x7f7f7f7f
#define inl inline
#define sqr(x) (x*x)
#define max(a,b) (a>b?a:b)
//#define eps 1e-8
#define debug puts("**************************");
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
using namespace std;
//const ll mod;
const ll MAXN=1e6+10;
inl ll read() {re ll x = 0; re int f = 1;char ch = getchar();while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x * f;
}
inl char readc() {char ch=getchar();while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();return ch;
}
inl void write(re ll x){if(x>=10)write(x/10);putchar(x%10+'0');
}
inl void writeln(re ll x){if(x<0) {x=-x;putchar('-');}write(x); puts("");
}
inl ll gcd(re ll x,re ll y){while(y^=x^=y^=x%=y);return x;}
inl ll Lcm(re ll a,re ll b) {return a/gcd(a,b)*b;}
inl void FR() {freopen(".in","r",stdin);freopen(".out","w",stdout);
}
inl void FC() {fclose(stdin);fclose(stdout);
}
ll root,id[MAXN],cnt;
struct Node {ll fa,son[2],sumx,val,siz,maxx,lx,rx;bool rev,flag;void clear() {fa=son[0]=son[1]=sumx=val=siz=maxx=lx=rx=rev=flag=0;}
}Tree[MAXN];
ll dir(ll x) {return Tree[Tree[x].fa].son[1]==x;}
inl void pushup(ll x) {re ll l=Tree[x].son[0],r=Tree[x].son[1];Tree[x].siz=Tree[l].siz+Tree[r].siz+1;Tree[x].sumx=Tree[l].sumx+Tree[r].sumx+Tree[x].val;Tree[x].maxx=max(Tree[r].maxx,Tree[l].maxx);Tree[x].maxx=max(Tree[x].maxx,Tree[l].rx+Tree[r].lx+Tree[x].val);Tree[x].lx=max(Tree[l].lx,Tree[l].sumx+Tree[x].val+Tree[r].lx);Tree[x].rx=max(Tree[r].rx,Tree[r].sumx+Tree[x].val+Tree[l].rx);
}
inl void pushdown(ll x) {re ll l=Tree[x].son[0],r=Tree[x].son[1];if(Tree[x].flag) {Tree[x].flag=Tree[x].rev=0;if(l) Tree[l].val=Tree[x].val,Tree[l].sumx=Tree[l].val*Tree[l].siz,Tree[l].flag=1;if(r) Tree[r].val=Tree[x].val,Tree[r].sumx=Tree[r].val*Tree[r].siz,Tree[r].flag=1;if(Tree[x].val>=0) {if(l) Tree[l].lx=Tree[l].rx=Tree[l].maxx=Tree[l].sumx;if(r) Tree[r].lx=Tree[r].rx=Tree[r].maxx=Tree[r].sumx;}else {if(l) Tree[l].lx=Tree[l].rx=0,Tree[l].maxx=Tree[l].val;if(r) Tree[r].lx=Tree[r].rx=0,Tree[r].maxx=Tree[r].val;}}if(Tree[x].rev) {Tree[x].rev=0;Tree[l].rev^=1;Tree[r].rev^=1;swap(Tree[l].lx,Tree[l].rx);swap(Tree[r].lx,Tree[r].rx);swap(Tree[l].son[0],Tree[l].son[1]);swap(Tree[r].son[0],Tree[r].son[1]);}
}
inl void rotate(ll x) {re ll y=Tree[x].fa,z=Tree[y].fa,o=dir(x);re ll so=dir(y);Tree[y].son[o]=Tree[x].son[o^1];Tree[Tree[y].son[o]].fa=y;Tree[x].son[o^1]=y;Tree[y].fa=x;Tree[z].son[so]=x;Tree[x].fa=z;pushup(y);pushup(x);
}
inl void splay(ll x,ll goal) {for(re ll y;(y=Tree[x].fa)!=goal;rotate(x)) {if(Tree[y].fa!=goal) rotate(dir(y)==dir(x)?y:x);}if(!goal) root=x;
}
inl ll find(ll x,ll rk) {pushdown(x);re ll l=Tree[x].son[0],r=Tree[x].son[1];if(Tree[l].siz+1==rk) return x;else if(Tree[l].siz>=rk) return find(l,rk);else return find(r,rk-Tree[l].siz-1);
}
ll s[MAXN];
inl ll build(ll l,ll r,ll fro) {re ll mid=(l+r)>>1,t=id[mid];Tree[t].clear();Tree[t].val=s[mid];Tree[t].fa=fro;if(l==r) {Tree[t].lx=Tree[t].rx=max(0,Tree[t].val);Tree[t].maxx=Tree[t].sumx=Tree[t].val;Tree[t].son[0]=Tree[t].son[1]=0;Tree[t].siz=1;return t;}if(l<mid) Tree[t].son[0]=build(l,mid-1,t);else Tree[t].son[0]=0;if(mid<r) Tree[t].son[1]=build(mid+1,r,t);else Tree[t].son[1]=0;pushup(t);return t;
}
char ss[20];
queue<ll>Q;
inl void insert(ll pos,ll tot) {for(re ll i=1;i<=tot;i++) s[i]=read();for(re ll i=1;i<=tot;i++) {if(!Q.empty()) id[i]=Q.front(),Q.pop();else id[i]=++cnt;}re ll l=find(root,pos+1),r=find(root,pos+2);splay(l,0);splay(r,l);Tree[r].son[0]=build(1,tot,r);pushup(r);pushup(l);
}
inl void recycle(ll x) {re ll &l=Tree[x].son[0],&r=Tree[x].son[1];if(l) recycle(l);if(r) recycle(r);Q.push(x);Tree[x].clear();l=r=0;
}
inl ll split(ll pos,ll tot) {re ll x=find(root,pos),y=find(root,pos+tot+1);splay(x,0);splay(y,x);return Tree[y].son[0];
}
inl void del(ll pos,ll tot) {re ll x=split(pos,tot),y=Tree[x].fa;recycle(x);Tree[y].son[0]=0;pushup(y);pushup(Tree[y].fa);
}
inl void modify(ll pos,ll tot,ll val) {re ll x=split(pos,tot),y=Tree[x].fa;Tree[x].flag=1;Tree[x].val=val,Tree[x].sumx=Tree[x].siz*Tree[x].val;if(Tree[x].val>=0) Tree[x].lx=Tree[x].rx=Tree[x].maxx=Tree[x].sumx;else Tree[x].lx=Tree[x].rx=0,Tree[x].maxx=Tree[x].val;pushup(y);pushup(Tree[y].fa);
}
inl void rever(ll pos,ll tot) {re ll x=split(pos,tot),y=Tree[x].fa;if(!Tree[x].flag) {Tree[x].rev^=1;swap(Tree[x].lx,Tree[x].rx);swap(Tree[x].son[0],Tree[x].son[1]);pushup(y);pushup(Tree[y].fa);}
}
inl ll query(ll pos,ll tot) {re ll x=split(pos,tot);return Tree[x].sumx;
}
int main() {
//  FR();re ll n=read(),m=read();for(re ll i=1;i<=n;i++) {s[i+1]=read();}Tree[0].maxx=s[1]=s[n+2]=-inf;cnt=n+2;for(re ll i=1;i<=n+2;i++) id[i]=i;root=build(1,n+2,0);for(re ll i=1;i<=m;i++) {scanf("%s",ss);if(ss[0]=='I') {re ll pos=read(),tot=read();insert(pos,tot);}else if(ss[0]=='D') {re ll pos=read(),tot=read();del(pos,tot);}else if(ss[0]=='M') {if(ss[2]=='X') writeln(Tree[root].maxx);else {re ll pos=read(),tot=read(),val=read();modify(pos,tot,val);}}else if(ss[0]=='R') {re ll pos=read(),tot=read();rever(pos,tot);}else if(ss[0]=='G') {re ll pos=read(),tot=read();writeln(query(pos,tot));}}
//  FC();return 0;
}

转载于:https://www.cnblogs.com/20020723YJX/p/9520947.html

[NOI2005]维护数列 恶心到毁天灭地的splay相关推荐

  1. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  2. 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列

    339. [NOI2005] 维护数列 时间限制:3 s   内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线' _ '表示实际 ...

  3. [NOI2005]维护数列

    输入格式 输入文件的第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目. 第 2 行包含 N 个数字,描述初始时的数列. 以下 M 行,每行一条命令,格式参见问题 ...

  4. [luogu2042] [NOI2005]维护数列

    前言 写写比较麻烦的这题 题目相关 题目大意 写一个大数据结构 数据范围 20000 题目链接 前置 先过模板题,比如会个非旋treap,写一下,通过[luogu3369][模板]普通平衡树 poss ...

  5. [BZOJ1500][NOI2005]维修数列(splay)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 16266  Solved: 5410 [Submit][Sta ...

  6. 【BZOJ1500】[NOI2005]维修数列 Splay

    [BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2 ...

  7. [BZOJ 1500] [NOI2005] 维修数列

    题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...

  8. 数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

    因为非常板,所以主要是代码 Tyvj 1728 普通平衡树 Chef and Sets [HNOI2012]永无乡 Play with Chain [NOI2005]维修数列 题目很水,所以可能会出现 ...

  9. JZOJ 2413. 【NOI2005】维护数列

    Description 请写一个程序,要求维护一个数列,支持以下6种操作:(请注意,格式栏中的下划线' _ '表示实际输入文件中的空格) 1. 插入 INSERT_posi_tot_c1_c2_-_c ...

最新文章

  1. LeetCode--024--两两交换链表中的节点(java)
  2. SSM整合框架实现ajax校验
  3. 100篇精选算法技术文章收藏
  4. vue怎么自己创建组件并引用_Vue 实现创建全局组件,并且使用Vue.use() 载入方式
  5. php 自动切图,前端工程师技能之photoshop巧用系列扩展篇自动切图
  6. 利用SQL*Loader将 Excel 数据导出到 Oracle 数据库中
  7. Hyper Text Transfer Protocol(超文本传输协议)
  8. qt 里面使用webengine
  9. Partition List -- LeetCode
  10. python中注释的定义_Python注释及变量
  11. html5 字段换行,关于换行以及换行属性
  12. 【转】密码破解全能工具:Hashcat密码破解攻略
  13. keil中设置的flash(irom)的起始地址为0x08000000,这个0x08000000的意义------stm32地址映射图解析
  14. excel填充序列_猴哥讲述:excel的自动填充功能——自动填充单元格
  15. 云速美建站手机端使用百度app打开手机端网站闪退的问题
  16. java文件转二进制
  17. linux中户主目录,如何在Ubuntu 18.04 Bionic Beaver Linux上配置Samba服务器共享
  18. 《天道》之丁元英的30句经典语录
  19. 【软件安装】金蝶安装指南
  20. 系统更新荣耀play服务器,华为宣布:荣耀Play推送EMUI 9.1正式版更新!

热门文章

  1. 海岸鸿蒙2018年标准物质,海岸鸿蒙——20年权威的标准物质研制单位
  2. 【机器学习】 - 激活函数与交叉熵Sigmoid, Softmax, binary_crossentropy, categorican_crossentropy区别
  3. 【Hihocoder - offer编程练习赛39 - D】前缀后缀查询(后缀字典树,哈希,思维)
  4. 【POJ - 1789】【ZOJ - 2158】【SCU - 1832】Truck History (最小生成树)
  5. php石头剪刀布五局三胜,求程序,下面是剪刀石头布的程序,谁能帮忙改成能选择三局两胜,五局三胜……的?能成功运行的加分...
  6. elementui表格宽度适应内容_elementui表格中的列怎么实现自适应列宽
  7. 计划的主体部分应有哪些内容_本科论文查重查哪些部分内容?需要注意什么?...
  8. java自定义线程_Java自定义线程池详解
  9. 计算日期时间间隔,可计算情侣计算在一起的。精确到,天,时,分,秒(输入的日期距离现在有:819天19670小时1180221分钟70813262秒)
  10. 刚学计算机先学什么好,计算机语言入门先学什么?