【bzoj1251】序列终结者

用魔法平衡树的实现!

反正没人会看的。

#include<bits/stdc++.h>
#define rat 5
#define newnode(s,v,a,b) (&(*st[cnt++]=Node(s,v,a,b)))
#define up(cur) pushdown(cur),pushup(cur),pushup(rt->lc),pushup(rt)
#define N 400005
using namespace std;
struct Node{
    int size,val,rev,addv;
    Node *lc,*rc;
    Node(int s,int v,Node *a,Node *b):size(s),val(v),lc(a),rc(b),rev(0),addv(0){}
    Node(){}
}*nul,*rt,*st[N],t[N];
int n,m,cnt;
inline void pushdown(Node *o){
    register Node *l=o->lc,*r=o->rc;
    if(o->addv){
        if(!l->size)o->val+=o->addv;
        else l->addv+=o->addv,r->addv+=o->addv;
        o->addv=0;
    }
    if(o->rev){
        if(l->size){
            l->rev^=1;r->rev^=1;
            swap(o->lc,o->rc);
        }o->rev=0;
    }
}
inline void pushup(Node *o){
    register Node *l=o->lc,*r=o->rc;
    if(l->size)o->size=l->size+r->size,o->val=max(l->val+l->addv,r->val+r->addv);
}
inline Node* merge(Node *a,Node *b){
    pushdown(a);pushdown(b);pushup(a);pushup(b);
    return newnode(a->size+b->size,max(a->val,b->val),a,b);
}
void split(int x,Node *o){
    pushdown(o);
    if(x>o->lc->size){
        split(x-o->lc->size,o->rc);o->lc=merge(o->lc,o->rc->lc);
        st[--cnt]=o->rc;o->rc=o->rc->rc;
    }
    else if(x<o->lc->size){
        split(x,o->lc);o->rc=merge(o->lc->rc,o->rc);
        st[--cnt]=o->lc;o->lc=o->lc->lc;
    }
    pushup(o);
}
Node* build(int l,int r){
    if(l==r)return newnode(1,0,nul,nul);
    int mid=(l+r)>>1;
    return merge(build(l,mid),build(mid+1,r));
}
inline Node* cut(int l,int r){
    split(r,rt);split(l-1,rt->lc);return rt->lc->rc;
}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘);
    do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘);
    return f*x;
}
int main(){
    n=read();m=read();
    for(int i=0;i<=N;i++)st[i]=&t[i];
    nul=new Node(0,0,0,0);
    rt=build(0,n+1);
    while(m--){
        int opt=read(),l=read()+1,r=read()+1;
        Node* o=cut(l,r);
        if(opt==1){o->addv+=read();up(o);}
        if(opt==2){o->rev^=1;up(o);}
        if(opt==3){pushdown(o);pushup(o);printf("%d\n",o->val);}
    }
}
时间: 2024-10-19 11:55:05

【bzoj1251】序列终结者的相关文章

BZOJ1251&#183;序列终结者

好像不能附传送门了..这是道sb权限题.. 1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MB Description 网 上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思.这道题目 就叫序列终

[BZOJ1251]序列终结者

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

bzoj1251: 序列终结者 (splay)

splay可以用于维护序列,比如noi的维修序列,比如这道 发现当时splay没写总结,也没题解 然后重新写splay竟然耗了一个晚上 结果是因为max[0]没有附最小值!!血一样的教训 最后祭出inline大法才过,我的splay真的慢到吐血 {$inline on} {$M 1000000000,0,maxlongint} const //mm=maxlongint>>2; maxn=60000; var size,left,right,mark,fa,value,max:array[0.

【bzoj1251】序列终结者 splay

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

BZOJ 1251 序列终结者(Splay)

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

【BZOJ】1251: 序列终结者(splay)

http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint... #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #inc

BZOJ 1251: 序列终结者( splay )

先orz一下clj...我的splay跟着他写的... 这道题很普通的splay我调了这么久 T T , 就是因为 null 的值初始化为0 , 结果就挂了... -------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream>

bzoj 1251: 序列终结者 2011-12-20

1251: 序列终结者Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 650  Solved: 277[Submit][Status][Discuss]Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可

【CodeVS4665】序列终结者

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

伸展树复习 (bzoj 1251 序列终结者)

本来要看LCT的,确发现自己弱得连splay都忘记了,复习一发,顺便重写一发 关键点: 1. 伸展树为左小右大的二叉树,所以旋转操作不会影响树的性质 2. 区间操作为: int u = select(L - 1), v = select(R + 1); splay(u, 0); splay(v, u); //通过旋转操作把询问的区间聚集到根的右子树的左子树下 因为伸展树为左小右大的二叉树,旋转操作后的所以对于闭区间[L, R]之间的所有元素都聚集在根的右子树的左子树下 因为闭区间[L, R],