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 ...
随机推荐
- ie浏览器和火狐浏览器对对容器宽度定义的差异
首先我们说说firefox和IE对CSS的宽度显示有什么不同: 其实CSS ’width’ 指的是标准CSS中所指的width的宽度,在firefox中的宽度就是这个宽度.它只包含容器中内容的宽度.而 ...
- hihocoder1705 座位问题
思路: 使用堆模拟.复习了priority_queue自定义结构体比较函数的用法. 实现: #include <bits/stdc++.h> using namespace std; ty ...
- [BZOJ1257][CQOI2007]余数之和sum 数学+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1257 题目所求为$$Ans=\sum_{i=1}^nk%i$$ 将其简单变形一下$$Ans ...
- Python3 动手自己写谷歌翻译
本篇为实现谷歌翻译的功能,在编写的时候以为只是一个接口的问题. 没想到的是每次翻译都会触发一次JS的执行,在请求参数中生成一个tk. 文中tk的实现是复用的网上大神的代码生成tk. 好了,不说了直接看 ...
- ARC(Automatic Reference Counting )技术概述
此文章由Tom翻译,首发于csdn的blog 转自:http://blog.csdn.net/nicktang/article/details/6792972 Automatic Reference ...
- win7电脑桌面壁纸曝光过高影响图标怎么办?亲测实用解决方法
现在用win7系统的人应该还是挺多的吧,虽然说windows家族已经升级到现在的win11了,相信大多数人家用的电脑系统还是win7吧,今天要讲的是一个壁纸曝光度过高的解决办法,虽然还不清楚为什么,但 ...
- 框架开发之Java注解的妙用
注解的好处:1.能够读懂别人写的代码,特别是框架相关的代码.2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰.3.(重点 ...
- 正则表达式,匹配查找函数(preg_match_all)flags参数对比
格式: int preg_match_all ( string pattern, string subject, array matches [, int flags] ) 参数 flags 选项有以 ...
- CAD绘制固定矩形标注(网页版)
js中实现代码说明: function DoFixRectComment() { var ent = mxOcx.DrawCustomEntity("TestMxCustomEntity&q ...
- vue的[__ob__: Observer]
为什么会获取不到里面的值 因为:vue data 里面值都是有这个属性的.这是被vue接管的数据,observer是Vue核心中最重要的一个模块(个人认为),能够实现视图与数据的响应式更新,底层全凭o ...