bzoj1251 序列终结者 splay

来源:互联网 发布:报表数据的重要性 编辑:程序博客网 时间:2024/05/17 02:29

题目链接:戳这里

1251: 序列终结者

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 4594  Solved: 1939
[Submit][Status][Discuss]

Description

网上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列 要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】 给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2. 将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。

Input

第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

Output

对于每个第3种操作,给出正确的回答。

Sample Input

4 4
1 1 3 2
1 2 4 -1
2 1 3
3 2 4

Sample Output

2
【数据范围】
N<=50000,M<=100000。

splay题。

对于每个节点维护三个值:add标记,max值和翻转标记,pushup和pushdown的时候更新一下就好。

代码:

#include<bits/stdc++.h>#define maxn 100005#define inf 1e9using namespace std;typedef long long LL;int read(){char c;int sum=0,f=1;c=getchar();while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0' && c<='9'){sum=sum*10+c-'0';c=getchar();}return sum*f;}int n,m;int son[maxn][2],fa[maxn],size[maxn],val[maxn],root,sz;int maxa[maxn],add[maxn],delta[maxn],a[maxn];bool getson(int x){return son[fa[x]][1]==x;}void pushup(int x){if(x){maxa[x]=val[x];if(son[x][0]) maxa[x]=max(maxa[x],maxa[son[x][0]]);if(son[x][1]) maxa[x]=max(maxa[x],maxa[son[x][1]]);size[x]=1;if(son[x][0]) size[x]+=size[son[x][0]];if(son[x][1]) size[x]+=size[son[x][1]];}}void pushdown(int x){if(delta[x]){swap(son[x][0],son[x][1]);if(son[x][0])delta[son[x][0]]^=1;if(son[x][1])delta[son[x][1]]^=1;delta[x]=0;}if(add[x]){if(son[x][0])add[son[x][0]]+=add[x],maxa[son[x][0]]+=add[x],val[son[x][0]]+=add[x];        if(son[x][1])add[son[x][1]]+=add[x],maxa[son[x][1]]+=add[x],val[son[x][1]]+=add[x];        add[x]=0;}}void rotate(int x){pushdown(fa[x]);    pushdown(x);int y=fa[x],z=fa[y],s=getson(x);son[y][s]=son[x][s^1];fa[son[y][s]]=y;fa[y]=x;son[x][s^1]=y;fa[x]=z;if(z)son[z][son[z][1]==y]=x;pushup(y);pushup(x);}void splay(int x,int k){for(int y;(y=fa[x])!=k;rotate(x)){if(fa[y]!=k)rotate(getson(y)==getson(x)?y:x);}if(!k) root=x;}int build(int l,int r,int f){if(l>r)return 0;int mid=l+r>>1,now=++sz;maxa[now]=val[now]=a[mid];fa[now]=f;delta[now]=add[now]=0;size[now]=1;int lson=build(l,mid-1,now);int rson=build(mid+1,r,now);son[now][0]=lson;    son[now][1]=rson;    pushup(now);return now;}int find(int x){    int now=root;    while(1){        pushdown(now);        if(son[now][0]&&size[son[now][0]]>=x)now=son[now][0];        else{            int tmp=1;            if(son[now][0])tmp+=size[son[now][0]];            if(x<=tmp)return now;            x-=tmp;now=son[now][1];        }    }}int main(){n=read();m=read();a[1]=-inf;a[n+2]=inf;root=build(1,n+2,0);while(m--){int f=read(),l=read(),r=read();int pre=find(l),nex=find(r+2);splay(pre,0);splay(nex,pre);if(f==1){int v=read();add[son[son[root][1]][0]]+=v;maxa[son[son[root][1]][0]]+=v;            val[son[son[root][1]][0]]+=v;            pushup(son[root][1]);            pushup(root);}if(f==2){delta[son[son[root][1]][0]]^=1;}if(f==3){int ans=maxa[son[son[root][1]][0]];            printf("%d\n",ans);}}return 0;}

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 齐劲张苒御宅书屋 张苒齐劲 张修齐 张宽 张富强 张富源给整一下多少钱 张寿武 张寿臣 张寿臣单口相声全集 张寿臣和马三立的恩怨 69丫e小视 张小丽 张小九 张小五的春天 庐江张小五出狱 张小光 张小兵 张小军 张小凡 神医张小凡 以妻之名张小凡 张小凡陆雪琪洞房 张小凡陆雪琪 张小凡上陆雪琪床 龙魂神医张小凡 陆雪琪张小凡 张小凡作品 张小凡喜欢碧瑶还是陆雪琪 张小凡和陆雪琪洞房 张小凡与陆雪琪洞房情节阅读 以妻之名张小凡在线阅读 都市绝品狂少张小凡 都市之绝品狂少张小凡 北张住宅小区 米初夏陆北业大结局47张 张小北和林清清 孙倩和张小北凤支 张小北林青青全文阅读 张小北林清清全部章节 张小娴 张小娴语录