首页 > 其他分享 >AcWing2437. Splay 题解

AcWing2437. Splay 题解

时间:2022-12-10 13:01:41浏览次数:33  
标签:sz int 题解 void tr Splay swap AcWing2437 push


题目大意:splay 执行区间翻转

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;

int n, m;
struct Node {
int s[2], p, v;
int sz, flag;

Node() {};
Node(int _v, int _p) {v = _v; p = _p; s[0] = s[1] = 0; flag = 0; sz = 1;}
} tr[maxn];
int root, idx;

void push_up(int x) {
tr[x].sz = tr[tr[x].s[0]].sz + tr[tr[x].s[1]].sz + 1;
}

void t_swap(int x) {
tr[x].flag ^= 1;
swap(tr[x].s[0], tr[x].s[1]);
}

void push_down(int x) {
if (tr[x].flag) {
t_swap(tr[x].s[0]);
t_swap(tr[x].s[1]);
tr[x].flag = 0;
}
}

void f_s(int p, int u, bool k) {
tr[p].s[k] = u;
tr[u].p = p;
}

void rot(int x) {
int y = tr[x].p, z = tr[y].p;
bool k = tr[y].s[1] == x;
f_s(z, x, tr[z].s[1]==y);
f_s(y, tr[x].s[k^1], k);
f_s(x, y, k^1);
push_up(y), push_up(x);
}

void splay(int x, int k) {
while (tr[x].p != k) {
int y = tr[x].p, z = tr[y].p;
if (z != k)
(tr[y].s[1]==x) ^ (tr[z].s[1]==y) ? rot(x) : rot(y);
rot(x);
}
if (!k) root = x;
}

void ins(int v) {
int u = root, p = 0;
while (u) {
p = u, u = tr[u].s[v > tr[u].v];
}
tr[u = ++idx] = Node(v, p);
if (p) tr[p].s[v > tr[p].v] = u;
splay(u, 0);
}

int get_k(int k) {
int u = root;
while (u) {
push_down(u);
if (tr[tr[u].s[0]].sz >= k) u = tr[u].s[0];
else if (tr[tr[u].s[0]].sz + 1 == k) return u;
else k -= tr[tr[u].s[0]].sz + 1, u = tr[u].s[1];
}
return -1;
}

void output(int u) {
if (!u) return;
push_down(u);
output(tr[u].s[0]);
if (tr[u].v >= 1 && tr[u].v <= n) printf("%d ", tr[u].v);
output(tr[u].s[1]);
}

int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i <= n+1; i++) {
ins(i);
}
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
l = get_k(l), r = get_k(r+2);
splay(l, 0), splay(r, l);
t_swap(tr[r].s[0]);
}
output(root);
return 0;
}



标签:sz,int,题解,void,tr,Splay,swap,AcWing2437,push
From: https://blog.51cto.com/u_13536312/5927500

相关文章

  • 洛谷P8767 [蓝桥杯 2021 国 A] 冰山 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P8767​​鸣谢:这道题的顺利解决得到了​​7KByte​​大佬的大力帮助,在此再次表示感谢。首先,我的想法是这样的:使用一个spl......
  • 【题解】P8866 [NOIP2022] 喵了个喵(构造,adhoc)
    【题解】P8866[NOIP2022]喵了个喵题目链接P8866[NOIP2022]喵了个喵题意概述有一个牌堆和\(n\)个可以从栈底删除元素的栈,任务是要通过规则将所有的卡牌消去。开......
  • #yyds干货盘点#按钮点击重复提交问题解决
    提交按钮重复点击这是最常见的问题,重复提交会造成多条数据入库。点击提交给个loading提示过渡,期间按钮不可再次触发就可以。​查询按钮重复点击如果查询按钮点一下就设置loa......
  • 题解 CF1713F【Lost Array】
    首先,为了方便将第\(1\)行的数从右往左重标号为\(0,1,\cdots,n-1\)。我们发现\((1,i)\)对于\((j,n+1)\)的贡献是\(C(i+j,i)\pmod2\),根据\(\text{lucas}......
  • P8377 [PFOI Round1] 暴龙的火锅 题解
    题目传送门题目背景暴龙爱吃火锅。题目描述定义\(S(x)\)表示\(x\)的每一位的数字之和,例如:\(S(14)=1+4=5\),\(S(114514)=1+1+4+5+1+4=16.\)另外,定义\(fib(x)\)代......
  • CF1458C 题解
    题意传送门\(T\)组测试数据,每次给一个\(n\timesn\)的矩阵,每行每列都是个\(1\ton\)的排列。有\(m\)次操作,如果是UDLR就是要把整个矩阵每行/每列往一个方向循环......
  • 当远程设备或者计算机不接受连接 问题解决
    远程设备或计算机不接受连接问题解决tmd一大中午打开电脑发现没网手机却有网给电脑连上热点也不行真tmd晦气解决方法这三个东西都勾选取消 ......
  • CF1218G Alpha planetary system 题解
    Part1设\(w_x\)表示点\(x\)的权值\(\bmod3\),\(c_x\)表示\(x\)的所属集合编号(\(c_x\in\{0,1,2\}\)),\(v_i\)表示第\(i\)条边的权值。一个直接的想法是使所有......
  • undefined reference to vtable for问题解决(QT)
    主要在运行时出现原因是在自定义类使用信号与槽,在创建文件时,未继承QObject类并且没有添加Q_OBJECT;解决:在需要的类中,添加Q_OBJECT,继承QObject类。然后使用QTCreator工......
  • labelme 安装使用及常见问题解决
    (目录)写在前面,本文为作者本人在学习使用labelme过程中遇到的各种问题,记录于此,希望对其他同学有所帮助。1.labelme安装labelme是麻省理工(MIT)的计算机科学和人工智能实验......