很显然的splay,第一次用splay操作区间...我实在佩服这个targan大佬,居然搞出这么牛逼的平衡树,调了大概5个小时终于搞定了。。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
#include<set>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 300005
#define ull unsigned long long
#define ll long long
#define hashmod 99999839
#define mod 9997
struct tree{//splay树
int sz[];//以当前结点为根的左右子树大小,不包括当前结点
int son[];//当前结点的左右儿子
int fa;//当前结点的父亲
int reverse;//翻转标记
int v;//当前结点表示的权值
}a[maxn];
int root;//根节点
int len;
int n,m,x,y,z;
bool f;
int isrson(int p,int f){
return a[f].son[] == p;
}
void update(int p){//更新p结点的size
if(a[p].son[] != -) a[p].sz[] = a[a[p].son[]].sz[] + a[a[p].son[]].sz[] + ;
else a[p].sz[] = ;
if(a[p].son[] != -) a[p].sz[] = a[a[p].son[]].sz[] + a[a[p].son[]].sz[] + ;
else a[p].sz[] = ;
}
void pushdown(int p){
swap(a[p].son[],a[p].son[]);
update(p);
a[p].reverse ^= ;
int ls = a[p].son[],rs = a[p].son[];
if(ls != -) a[ls].reverse ^= ;
if(rs != -) a[rs].reverse ^= ;
}
int find(int x){//找到序列第x个数对应的结点
int p = root;
for(;;){
if(a[p].reverse) pushdown(p);
if(a[p].sz[] >= x) p = a[p].son[];
else if(a[p].sz[] + == x) return p;
else x = x - a[p].sz[] - ,p = a[p].son[];
}
}
void changeson(int p,int f,int v){//把p作为f的v儿子,p,f不一定存在
if(f != -) a[f].son[v] = p;
if(p != -) a[p].fa = f;
if(f == -) root = p;
}
void rotate(int p){
int f = a[p].fa,g = a[f].fa;
int u = isrson(p,f),v = isrson(f,g);
changeson(a[p].son[u^],f,u),changeson(f,p,u^),changeson(p,g,v);//改变p,f,g的父子关系
update(f),update(p);
}
void splay(int p,int tar){
if(a[p].fa == tar) return;
while(a[a[p].fa].fa != tar && a[p].fa != tar){
int f = a[p].fa,g = a[f].fa;
int u = isrson(p,f),v = isrson(f,g);
if(u ^ v) rotate(p),rotate(p);
else rotate(f),rotate(p);
}
if(a[p].fa != tar) rotate(p);
}
void getsection(int x,int y){//得到[x,y]区间
splay(find(x - ),-),splay(find(y + ),root);
}
void build(int l,int r){
len++;
int p = len;
int mid = (l + r) >> ;
a[p].v = mid,a[p].sz[] = a[p].sz[] = ;
a[p].son[] = a[p].son[] = -;
if(l == r) return;
if(l <= mid - ) changeson(len + ,p,),build(l,mid-);
if(mid + <= r) changeson(len + ,p,),build(mid+,r);
update(p);
}
void flip(int x,int y){
getsection(x,y);//得到区间[x,y]后打标记
int p = a[a[root].son[]].son[];
a[p].reverse ^= ;
}
void cut(int x,int y,int z){//cut [x,y] z 把区间x,y剪切到z位置后
//先得到区间[x,y],将其x-1rotate到根,将y+1rotate到根的儿子,则y+1结点的左儿子为根的树即为该区间
getsection(x,y);
int p = a[a[root].son[]].son[];
a[a[p].fa].son[] = -;
update(a[p].fa),update(root);
int t = p;
p = find(z);
splay(p,-),p = find(z + ),splay(p,root);
p = a[root].son[],a[p].son[] = t,a[t].fa = p;
update(p),update(root);
}
void print(int p){
if(p == -) return;
if(a[p].reverse) pushdown(p),update(p);
print(a[p].son[]);
if(a[p].v != && a[p].v != n + )
if(!f) printf("%d",a[p].v),f = true;
else printf(" %d",a[p].v);
print(a[p].son[]);
}
int main(){
freopen("a.in","r",stdin);
freopen("b.out","w",stdout);
char op[];
while(~scanf("%d%d",&n,&m)){
if(n < && m < ) break;
len = ,root = ,f = false;
build(,n+);
a[root].fa = -;
for(int i = ;i <= m;++i){
scanf("%s",op);
if(op[] == 'C'){
scanf("%d%d%d",&x,&y,&z);
++x,++y,++z;
cut(x,y,z);
continue;
}
scanf("%d%d",&x,&y);
++x,++y;
flip(x,y);
}
print(root),putchar('\n');
}
return ;
}

csu1365 Play with Chain的更多相关文章

  1. STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案

    现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...

  2. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  3. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  4. arm,iptables: No chain/target/match by that name.

    最近由于项目需要,需要打开防火墙功能. 公司有 arm linux 3.0x86 linux 3.2x86 linux 2.4 的三个嵌入式.都需要打开防火墙功能. 执行“whereis iptabl ...

  5. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

  6. [工作中的设计模式]责任链模式chain

    一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...

  7. track message forwards, avoiding request loops, and identifying the protocol capabilities of all senders along the request/response chain

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html The TRACE method is used to invoke a remote, ...

  8. JAX-WS使用Handler Chain加工消息

    承前 本文的示例,是基于前一篇文章中的实例而改进的,如果想要运行本文的代码例子,需要先实现前一篇的代码. 前一篇文章JAX-WS开发WebService初级 Handler概念 在WebService ...

  9. 配置DelegatingFilterProxy使用Spring管理filter chain

    项目环境:JDK7 + Maven3.04 0. 项目使用springmvc作为controller层 1. 引入spring-security <dependency> <grou ...

随机推荐

  1. Windows10系统切换JDK版本(前提是装了多个版本的JDK)

    由于是直接截屏,等我回过头来整理的时候忘记了文章原来的出处, 如作者本人看到,如有侵权,请联系删除!

  2. LN : leetcode 312 Burst Balloons

    lc 312 Burst Balloons 312 Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is pa ...

  3. Android开源项目:GifView——Android显示GIF动画

    下载:http://code.google.com/p/gifview/downloads/list 简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常 ...

  4. android ListView 分析(一)

    需要了解的内容 1. listview中的getItemAtPosition与Adapter的getItem的position的区别          listView中的getItemAtPosit ...

  5. Uml 建模 一(类图建模和startuml的使用)

    本文将分三个部分介绍Uml建模:Uml建模的作用.类图.startuml的使用 Uml的作用 本文以java为例介绍Uml,在当前的软件开发中大多数使用面向对象开发(OO),面向对象的就是将现实世界中 ...

  6. jquery 序列化form表单

    1.为什么要将form表单序列化? ajax上传form表单的原始方式,是将form表单中所需要的键值对先获取,然后再组装成数据(两种方式:http:localhost:8080/test.do?pe ...

  7. 将php中session存入redis中

    PHP 的会话默认是以文件的形式存在的,可以配置到 Redis 中,即提高了访问速度,又能很好地实现会话共享! 配置方式如下: 方法一:修改 php.ini 的设置 session.save_hand ...

  8. ios开发介绍

    iOS开发概述 •什么是IOS •什么是IOS开发 •为什么要选择IOS开发 •学习IOS开发的准备   1.什么是iOS   •iOS是一款由苹果公司开发的操作系统(OS是Operating Sys ...

  9. iTOP-4418/6818开发板支持双屏异显,双屏同显

    iTOP-4418/6818开发板平台安卓系统下支持双屏异显,双屏同显,客户可按照不同用途,分别播放适合屏幕显示方式的内容 ,如HDMI屏幕和LCD屏幕显示不同内容, 一个屏幕播放广告,另一个屏幕运行 ...

  10. SpringMVC 控制器统一异常处理

    摘要介绍spring mvc控制器中统一处理异常的两种方式:HandlerExceptionResolver以及@ExceptionHandler:以及使用@ControllerAdvice将@Exc ...