题目链接:

解法:

先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记。

#include <bits/stdc++.h>
using namespace std;
#define ls(p) p << 1
#define rs(p) p << 1 | 1
const int M = 1e5 + ;
int n, m, cnt;
int rt[M];
struct node{
int fa, ch[], val, cnt, sz, lazy;
}spl[M];
bool ident(int x, int f) {
return spl[f].ch[] == x;
}
void connect(int x, int f, int s){
spl[f].ch[s] = x;
spl[x].fa = f;
}
void update(int now) {
spl[now].sz = spl[spl[now].ch[]].sz + spl[spl[now].ch[]].sz + spl[now].cnt;
}
void push_down(int now) {
if(!spl[now].lazy) return;
swap(spl[now].ch[], spl[now].ch[]);
spl[spl[now].ch[]].lazy ^= ;
spl[spl[now].ch[]].lazy ^= ;
spl[now].lazy = ;
}
void rotate(int x) {
int f = spl[x].fa, ff = spl[f].fa, k = ident(x, f);
connect(spl[x].ch[k ^ ], f, k);
connect(x, ff, ident(f, ff));
connect(f, x, k ^ );
update(f), update(x);
}
void splaying(int p, int x, int top) {
if(!top) rt[p] = x;
//printf("top = %d\n", top);
while(spl[x].fa != top) {
//if(num <= 5) num++, printf("\n%d %d\n", x, top);
int f = spl[x].fa, ff = spl[f].fa;
if(ff != top) ident(f, ff) ^ ident(x, f) ? rotate(x) : rotate(f);
rotate(x);
}
}
int find_r(int now) {
push_down(now);
while(spl[now].ch[]) {
now = spl[now].ch[];
push_down(now);
}
return now;
}
int find_l(int now) {
push_down(now);
while(spl[now].ch[]) {
now = spl[now].ch[];
push_down(now);
}
return now;
}
void newnode(int now, int val) {
spl[now].val = val;
spl[now].sz = ;
spl[now].cnt = ;
spl[now].ch[] = ;
spl[now].ch[] = ;
spl[now].fa = ;
spl[now].lazy = ;
}
void work(){
for(int i = ; i <= n; i++) {
rt[i] = i;
newnode(i, i);
}
for(int i = ; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
if(!rt[u]) {
if(rt[v]){
rt[u] = rt[v];
spl[rt[u]].lazy ^= ;
rt[v] = ;
}
}
else if(!rt[v]) {
spl[rt[u]].lazy ^= ;
}
else {
int r = find_r(rt[u]);
splaying(u, r, );
//printf("1 \n");
int l = find_l(rt[v]);
//printf("3\n");
splaying(v, l, );
//printf("2\n");
connect(l, r, );
spl[rt[u]].lazy ^= ;
rt[v] = ;
update(rt[u]);
}
}
}
void out(int now){
if(!now) return;
push_down(now);
out(spl[now].ch[]);
printf("%d ", spl[now].val);
out(spl[now].ch[]);
}
int main(){
while(~scanf("%d%d", &n, &m)){
cnt = ;
work();
printf("%d ", spl[rt[]].sz);
if(spl[rt[]].sz) out(rt[]);
printf("\n");
}
return ;
}
/*
999 5
99 8
8 99
99 8
7 99
1 7
*/
/*
999 5
1 3
1 4
1 5
1 6
1 7
*/

2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转的更多相关文章

  1. 2019牛客国庆集训派对day1(A, B E F K)

    链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...

  2. 2019牛客国庆集训派对day1

    C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...

  3. 2019牛客国庆集训派对day5

    2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...

  4. 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)

    链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  5. 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)

    链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...

  6. 2019牛客国庆集训派对day7 A 2016

    链接:https://ac.nowcoder.com/acm/problem/52800来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...

  7. 牛客国庆集训派对Day1 L-New Game!(最短路)

    链接:https://www.nowcoder.com/acm/contest/201/L 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

  8. 计算几何板子题【2019牛客国庆集训派对day7——三角形和矩形】【多边形相交的面积】

    链接:https://ac.nowcoder.com/acm/contest/1112/J来源:牛客网 题目描述 Bobo 有一个三角形和一个矩形,他想求他们交的面积. 具体地,三角形和矩形由 8 个 ...

  9. 牛客国庆集训派对Day1.B.Attack on Titan(思路 最短路Dijkstra)

    题目链接 \(Description\) 给定\(n,m,C\)及大小为\((n+1)(m+1)\)的矩阵\(c[i][j]\).平面上有\((n+1)(m+1)\)个点,从\((0,0)\)编号到\ ...

随机推荐

  1. MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比

    MyBatis 学习笔记(七)批量插入ExecutorType.BATCH效率对比一.在mybatis中ExecutorType的使用1.Mybatis内置的ExecutorType有3种,默认的是s ...

  2. JVM堆内存参数优化,让性能飞起来

    堆内存是Java进程的重要组成部分,几乎所有与应用相关的内存空间都和堆有关.现在主要介绍与堆内存相关的参数设置,这些参数对Java虚拟机中非常重要的,也是对程序性能有着重要的影响.让你彻底脱离OOM内 ...

  3. js中基本包装类型详情

    基本包装类型 基本包装类型有Boolean,Number和string类型,每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型对象. 从逻辑上,基本类型值不是对象,没有方法,但从技术上来看, ...

  4. Python之路【第十五篇】开发FTP多线程程序

    要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...

  5. sublime text 疑难解决

    sublime text 白色边框方框解决方法 https://blog.csdn.net/weixin_43228019/article/details/82766316 Sublime Text提 ...

  6. go switch 和java C#有不同

    1 switch 后的语句可以有简单的赋值语句 2 case :后的语句结束后不需要break;默认自动结束 除非以 fallthrough 语句结束,否则分支会自动终止 没有条件的 switch 有 ...

  7. 【题解】Luogu P5360 [SDOI2019]世界地图

    原题传送门 每次查询的实际就是将地图的一个前缀和一个后缀合并后的图的最小生成树边权和 我们要预处理每个前缀和后缀的最小生成树 实际求前缀和(后缀和)的过程珂以理解为上一个前缀和这一列的最小生成树进行合 ...

  8. 全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

    通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...

  9. Spring @Autowired 注入为 null

    原因 配置缺失,比如为开启注解扫描驱动.注入组件为注册: 使用 new 关键字创建的对象不受spring容器管理,无法注入: 注入静态变量, 静态变量/类变量不是对象的属性,而是一个类的属性,spri ...

  10. java之hiberante之集合映射之list映射

    这篇讲解 集合映射之List映射 1.通常对于集合,在hibernate中的处理都是使用set来完成.但是hibernate也提供了对于其他几种集合的映射. 在这里实现List的映射,List是有序的 ...