题目链接:

解法:

先建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. texlive2019安装

    TeX Live 是 TUG (TeX User Group) 发布并维护的的 TeX 系统,可以称得上是TeX的官方系统,官网为:https://www.tug.org/texlive/ 1.通过最 ...

  2. WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

    原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标 ...

  3. bat命令复制文件

    del HDT675.applicationdel setup.exedel publish.htmRD /S /Q "Application Files"xcopy /E \\1 ...

  4. 实战Go内存泄露【转】

    最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露 ...

  5. Matlab外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.本文以计算机为例,用Matlab代码实现外观模式.计算机包括CPU.内存以及硬盘等这些部件.用户 ...

  6. Maven打包时集成依赖项或复制依赖项到指定目录

    1.集成依赖项,最后生成的jar文件包含所有依赖: <build> <plugins> <plugin> <artifactId>maven-assem ...

  7. java系统化基础-day02-运算符、选择结构、循环结构

    1.java中的运算符 package com.wfd360.day02; import org.junit.Test; import java.math.BigInteger; /** * 1.算术 ...

  8. Apache Flink 零基础入门(转)

    这是一份很好的 Apache Flink 零基础入门教程. Apache Flink 零基础入门(一&二):基础概念解析 Apache Flink 零基础入门(三):开发环境搭建和应用的配置. ...

  9. php操作mysql,1分钟内插入百万数据

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_33862644/article/d ...

  10. 基于cmake编译glew

    cmake已经成为了C/C++开源项目的主流构建工具.glew也提供了cmake的脚本,但用cmake编译glew容易采坑:glew的github上的代码,无论是master分支还是glew-2.1. ...