2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转
解法:
先建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区间翻转的更多相关文章
- 2019牛客国庆集训派对day1(A, B E F K)
链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...
- 2019牛客国庆集训派对day1
C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 2019 牛客国庆集训派对day1-C Distinct Substrings(exkmp+概率)
链接:https://ac.nowcoder.com/acm/contest/1099/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)
链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...
- 2019牛客国庆集训派对day7 A 2016
链接:https://ac.nowcoder.com/acm/problem/52800来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...
- 牛客国庆集训派对Day1 L-New Game!(最短路)
链接:https://www.nowcoder.com/acm/contest/201/L 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
- 计算几何板子题【2019牛客国庆集训派对day7——三角形和矩形】【多边形相交的面积】
链接:https://ac.nowcoder.com/acm/contest/1112/J来源:牛客网 题目描述 Bobo 有一个三角形和一个矩形,他想求他们交的面积. 具体地,三角形和矩形由 8 个 ...
- 牛客国庆集训派对Day1.B.Attack on Titan(思路 最短路Dijkstra)
题目链接 \(Description\) 给定\(n,m,C\)及大小为\((n+1)(m+1)\)的矩阵\(c[i][j]\).平面上有\((n+1)(m+1)\)个点,从\((0,0)\)编号到\ ...
随机推荐
- IDEA界面太丑??尝试一下这几个风格
>>>>>>>>>>原文地址<<<<<<<<<< >>>> ...
- 递归实现全排列python
python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",st ...
- Python2 和 Python3区别
字符串类型不同 py3: str bytes py2: unicode str 默认解释器编码 输入输出 int int long 除法 range和xrang 模块和包 字典 keys py2:列表 ...
- day02——while、字符串格式化、运算符、编码初识
day02 while--关键字(死循环) 格式:while 条件: 循环体 print(1) while True: print("痒") print("鸡你太美& ...
- CentOS7安装rabbitmq集群(二进制)
一.RabbiMQ简介 RabbiMQ是用Erang开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡. RabbiMQ模式 RabbitMQ模式大概分为以下三种: ...
- HTML5+规范:nativeUI(管理系统原生界面)
nativeUI管理系统原生界面,可用于弹出系统原生提示对话框窗口.时间日期选择对话框.等待对话框等. 1.方法 1.1.actionSheet: 弹出系统选择按钮框 void plus.native ...
- .Net MVC如何渲染带有网页标签的字符串
有时候我们在解析一段文字时,可能文字中会包含网页上的标签,如div.p等等.那么如果将这种文字渲染成对应的标签效果呢?如图,最近博主就拿到了这么一段字符串(如图) 由于中间带有很多特殊字符,用Html ...
- vs2013 C++编译器在调试的时候无法看到变量的值
- 2019 光环新网科技java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.光环新网科技等公司offer,岗位是Java后端开发,因为发展原因最终选择去了光环新网科技,入职一年时间了,也 ...
- Gson含抽象类的反序列化
Gson含抽象类的反序列化 场景描述: 反序列化A类的时候,这个类里面有一个抽象类属性B,B的实现类C里面又有一个抽象类属性D,D的实现类是E 实体类准备 public class A impleme ...