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)\)编号到\ ...
随机推荐
- 一秒可生成500万ID的分布式自增ID算法—雪花算法 (Snowflake,Delphi 版)
概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...
- day53——标签操作
day53 今日内容 标签操作 值操作 取值: 文本输入框:$('#username').val(); input,type=radio单选框: $('[type="radio"] ...
- Vue框架——页面组件中使用小组件
小组件在components文件夹中,页面组件在views文件夹中 一.先写小组件的vue,比如text.vue(在template设置模板渲染,style设置样式) <template> ...
- 通过 SMB 共享目录
在 system1 上配置SMB服务 ,要求: 1.您的 SMB 服务器必须是 STAFF 工作组的一个成员 2.共享 /common 目录,共享名必须为 common 3.只有 group8.exa ...
- Drools7 Hello Wrold 入门详细步骤--系列01课
一.什么叫规则引擎?规则--->写在文档上引擎--->在java代码上,引用这个文档上的规则 二.drools规则引擎有什么用?简单来说就是将多变的规则,从业务代码中剥离出来(当规则变了之 ...
- JAVA8的java.util.function包
一 概述 name type description Consumer Consumer< T > 接收T对象,不返回值 Predicate Predicate< T > 接收 ...
- MVC学习笔记(四)---使用linq多表联查(SQL)
1.数据库原型(Students表中的ID和Scores表中的StudentID是对应的) 2.实现效果:查询出每个学生各个科目的成绩(用的是MVC学习笔记(三)—用EF向数据库中添加数据的架构) C ...
- JavaScript 的内置对象和浏览器对象
JavaScript 中对象通常包括两种类型:内置对象和浏览器对象,此外用户还可以自定义对象. 在 ECMAScript 中,更精确的定义应该分为:本地对象.内置对象和宿主对象. 对象包含两个要素: ...
- Implement CGLIB in ABAP
What is cglib?A Byte Code Generation Library which is high level API to generate and transform Java ...
- angularcli 第五篇(输入框、表单处理)
本文参考:Angular4 表单快速入门 注:涉及input表单时要在AppComponent中引入 FormsModule模块: import{ FormsModule } from '@a ...