很显然的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. 使用 ServerSocket 进行文件上传,以及用Tomcat启动ServerSocket时,会卡死解决

    服务器端代码 import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOExcept ...

  2. AJPFX关于构造器的总结

    构造器        构造器定义        构造器作用        构造器特点        构造器修饰符        默认构造器        构造器重载        构造器和一般函数的区 ...

  3. AJPFX简述java语言现状和发展

    作为一种最流行的网络编程语言之一,java语言在当今信息化社会中发挥了 重要的作用.Java语言具有面向对象.跨平台.安全性.多线程等特点,这使得java成为许多应用系统的理想开发语言.java应用在 ...

  4. Spark学习之基于MLlib的机器学习

    Spark学习之基于MLlib的机器学习 1. 机器学习算法尝试根据训练数据(training data)使得表示算法行为的数学目标最大化,并以此来进行预测或作出决定. 2. MLlib完成文本分类任 ...

  5. sql server 2008 r2 无法定位到数据库文件目录

    像这样,选择数据库文件时, 无法定位到文件夹目录,子目录下的都不显示.明明选择的这个文件夹里还有很多子文件夹,却显示不了. 解决方法: 在此文件夹上右击,属性-安全 添加红框中的用户就可以了.

  6. c# 导出DataSet到excel

    public static bool ExportToExcel_dataSet(string queryNo, string conditions) { bool _bl = false; try ...

  7. Regular Expression Flavors

    Perl https://perldoc.perl.org/perlre.html PCRE http://www.pcre.org/current/doc/html/pcre2syntax.html ...

  8. laravel学习:容器绑定与解析

    1.在服务容器中注册类(bind) $this->app->bind('sender','MailSender');//$this->app成为服务容器.   2.从服务容器生成类( ...

  9. idea拉出Output窗口和还原窗口

    拉出:按住标题可以拖出 效果: 还原:点击restore layout

  10. 笔试算法题(43):布隆过滤器(Bloom Filter)

    议题:布隆过滤器(Bloom Filter) 分析: BF由一个很长的二进制向量和一系列随机映射的函数组成,通过多个Hash函数将一个元素映射到一个Bit Array中的多个点,查询的时候仅当所有的映 ...