csu1365 Play with Chain
很显然的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的更多相关文章
- 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 ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- arm,iptables: No chain/target/match by that name.
最近由于项目需要,需要打开防火墙功能. 公司有 arm linux 3.0x86 linux 3.2x86 linux 2.4 的三个嵌入式.都需要打开防火墙功能. 执行“whereis iptabl ...
- C#设计模式系列:职责链模式(Chain of Responsibility)
1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...
- [工作中的设计模式]责任链模式chain
一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...
- 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, ...
- JAX-WS使用Handler Chain加工消息
承前 本文的示例,是基于前一篇文章中的实例而改进的,如果想要运行本文的代码例子,需要先实现前一篇的代码. 前一篇文章JAX-WS开发WebService初级 Handler概念 在WebService ...
- 配置DelegatingFilterProxy使用Spring管理filter chain
项目环境:JDK7 + Maven3.04 0. 项目使用springmvc作为controller层 1. 引入spring-security <dependency> <grou ...
随机推荐
- Spring Mvc相关随笔
web.xml部分 1.欢迎界面 <welcome-file-list> <welcome-file>/views/login.jsp</welcome-file> ...
- R in action读书笔记(19)第十四章 主成分和因子分析
第十四章:主成分和因子分析 本章内容 主成分分析 探索性因子分析 其他潜变量模型 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分.探索性因 ...
- 模块 (Module)
#1.模块概念的官网描述 -- Module If you quit from the Python interpreter and enter it again, the definitions y ...
- KVM环境下vCPU绑定到物理CPU
在KVM环境中测试虚拟系统性能时,如果宿主机是有两个CPU socket的硬件,会碰到由于vCPU在不同物理CPU上浮动导致测试RFC2544时出现少量丢包的现象,测试结果非常不稳定.可以将vCPU绑 ...
- 火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0 DiskGenius500
火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0 DiskGenius500 结果:由于时间比较常 恢复文件均失败了~
- windows开发错误
2018/07/16: 1.问题: 代码: list <int> listN; error C2065:'list' : undeclared identifier 我已经#include ...
- [JOYOI] 1055 沙子合并
题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N<=300).每堆沙子有 ...
- elementui 后台管理系统遇到的问题(二) 树形控件 el-tree
elementui中树形控件的使用 一.将后台返回的数据填充到前端控件中,需要注意的几点问题 (1).el-tree中需要绑定node-key='自定义的id名称' (2).在配置data中defau ...
- Buffer.allocUnsafe()
Buffer.allocUnsafe(size) size {Number} 分配一个 size 字节大小的新的非零填充(non-zero-filled)的 Buffer.size 必须小于等于 re ...
- Win2008 Server搭建流媒体服务(在线看电影)
什么是流媒体服务呢. 所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式, 与需要将整个视频文件全部下载之后才能观看的传统方式相比, 流媒体技术是通过将视频文件经过特殊的压缩方式分成一个 ...