/*

4655 序列终结者

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 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 Description

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

输出描述 Output Description

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

//splay树  第一次知道spaly树还可以这么玩,好开心。。。

//不过因为一个小错误调了半天。

#include<cstdio>
#include<iostream>
using namespace std;
int n,v[50005],shu[50005][2],fa[50005],m,size,sz[50005],mx[50005],root;
int he[50005],bi[50005];
void geng(int a1)
{
 sz[a1]=sz[shu[a1][0]]+sz[shu[a1][1]]+1;
    mx[a1]=max(mx[shu[a1][0]],mx[shu[a1][1]]);
    mx[a1]=max(mx[a1],v[a1]);
    return;
}
void roate(int a1,int &k)
{
 int y=fa[a1],z=fa[y],l,r;
 if(shu[y][0]==a1)
   l=0;
 else
   l=1;
 r=l^1;
 if(y==k)
   k=a1;
 else
   if(shu[z][0]==y)
     shu[z][0]=a1;
   else
     shu[z][1]=a1;
 fa[a1]=z;
 shu[y][l]=shu[a1][r];
 fa[shu[a1][r]]=y;
 shu[a1][r]=y;
 fa[y]=a1;
 geng(a1);
 geng(y);
 return;
}
void splay(int &k,int a1)
{
 for(;a1!=k;)
   {
    int y=fa[a1],z=fa[y];
    if(y!=k)
      if(shu[z][0]==y^shu[y][0]==a1)
       roate(a1,k);
     else
          roate(y,k);
  roate(a1,k);       
   }
}
void geng1(int a1)
{
 int l=shu[a1][0],r=shu[a1][1];
 if(he[a1])
      {
       if(l){mx[l]+=he[a1];v[l]+=he[a1];he[l]+=he[a1];}
       if(r){mx[r]+=he[a1];v[r]+=he[a1];he[r]+=he[a1];}
       he[a1]=0;
   }
 if(bi[a1])
   {
    bi[l]^=1;
    bi[r]^=1;
    bi[a1]=0;
    swap(shu[a1][0],shu[a1][1]);
   }
}
void jian(int a1,int a2,int a3)
{
 if(a1>a2)
   return;
 if(a1==a2)
   {
    fa[a1]=a3;
    if(a1<a3)
      shu[a3][0]=a1;
    else
      shu[a3][1]=a1;
    sz[a1]=1;
     return;
   }
 int mid=(a1+a2)>>1;
 fa[mid]=a3;
 if(mid<a3)
   shu[a3][0]=mid;
 else
   shu[a3][1]=mid;
    jian(a1,mid-1,mid);
    jian(mid+1,a2,mid);
    geng(mid);
}
int find(int a1,int a2)
{
 if(he[a1]||bi[a1])geng1(a1);
 if(sz[shu[a1][0]]==a2-1)
   return a1;
 if(sz[shu[a1][0]]>=a2)
   return(find(shu[a1][0],a2));
 return(find(shu[a1][1],a2-sz[shu[a1][0]]-1));
}
void jia(int a1,int a2,int a3)
{
 int x=find(root,a1);
 int y=find(root,a2+2);
 splay(root,x);
 splay(shu[x][1],y);
 int z=shu[y][0];
 v[z]+=a3;
 mx[z]+=a3;
 he[z]+=a3;
 return;
}
void fan(int a1,int a2)
{
 int x=find(root,a1),y=find(root,a2+2);
 splay(root,x);
 splay(shu[x][1],y);
 int z=shu[y][0];
 bi[z]^=1;
 return;
}
int zhao(int a1,int a2)
{
 int x=find(root,a1),y=find(root,a2+2);
 splay(root,x);
 splay(shu[x][1],y);
 int z=shu[y][0];
 return mx[z];
}
int main()
{
 mx[0]=-999999999;
 scanf("%d%d",&n,&m);
 jian(1,n+2,0);
 root=(n+3)>>1;
 for(int i=0;i<m;i++)
   {
    int a1,a2,a3,a4;
    scanf("%d%d%d",&a1,&a2,&a3);
    if(a1==1)
      {
       scanf("%d",&a4);
       jia(a2,a3,a4);
   }
  if(a1==2)
    fan(a2,a3);
  if(a1==3)
    printf("%d\n",zhao(a2,a3));
   }
}

splay树 序列终结者的更多相关文章

  1. Splay模板(序列终结者)

    我只是一个存模板的,详细的请看这里http://blog.csdn.net/whai362/article/details/47298133 题目链接:http://www.codevs.cn/pro ...

  2. BZOJ 1251 序列终结者(Splay)

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...

  3. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  4. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  5. 【BZOJ1251】序列终结者 Splay

    一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

  7. bzoj1251 序列终结者(Splay Tree+懒惰标记)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  8. 「BZOJ1251」序列终结者 (splay 区间操作)

    题面: 1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5367  Solved: 2323[Submit][Status][D ...

  9. 1251. 序列终结者【平衡树-splay】

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

随机推荐

  1. 机器学习-聚类-k-Means算法笔记

    聚类的定义: 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小,它是无监督学习. 聚类的基本思想: 给定一个有N个对象的数据集 ...

  2. Linux查询命令帮助信息(知道)

    方法一 command --help 方法二 man command 操作涉及到的按键: 空格键:显示手册的下一屏 Enter键:一次滚动手册的一行 b:回滚一屏 f:前滚一屏 q:退出 结果基本上全 ...

  3. binlogserver搭建

    在MySQL 5.7.x版本中,mysqlbinlog工具解析任何一个本地的binlog或relay log时,都不会在mysqlbinlog命令执行结束时追加rollback语句, 但在MySQL ...

  4. Python 操作MySQL 数据库

    Python 操作 MySQL 数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的 ...

  5. 偷窥篇:重要的C#语言特性——30分钟LINQ教程

    本文转自:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看 ...

  6. 快速批量删除 docker 镜像或容器

    原文:快速批量删除 docker 镜像或容器 点击在我的博客 xuxusheng.com 中查看,有更好的排版哦~ docker 本身并没有提供批量删除的功能,当有大量的镜像或者容器需要删除的时候,手 ...

  7. VS.NET(C#)--2.1认识控件

    Web控件 四种控件 1.HTML控件 2.HTML服务器控件    在服务器端执行 3.ASP.NET服务器控件   在服务器端执行 4.用户控件和自定义控件  用户自定义控件在服务器端执行 注意: ...

  8. JS权威指南读书笔记(一)

    第一章 JavaScript概述 1 JS是一门高端的.动态的.弱类型的编程语言,非常适合面向对象和函数式的编程风格.   第二章 词法结构 1 JS程序是用Unicode字符集编写的. 2 JS是区 ...

  9. CSS选取第一个、最后一个、偶数、奇数、第n个标签元素

    1.first-child first-child表示选择列表中的第一个标签.例如:li:first-child{background:#fff} 2.last-child last-child表示选 ...

  10. hive四种排序

    order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...