感觉比普通平衡树易懂
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
struct Node{
int p, s[2], mark;
int v, tag, size;
void init(int p1, int v1){
p = p1, v = v1, size = 1;
}
}tr[N];
int root, idx;
int n, q;
void pushdown(int x){
if(tr[x].tag == 0)return;
swap(tr[x].s[0], tr[x].s[1]);
tr[tr[x].s[0]].tag ^= 1;
tr[tr[x].s[1]].tag ^= 1;
tr[x].tag = 0;
}
int get_k(int k){
int x = root;
while(1){
pushdown(x);
int y = tr[x].s[0];
if(tr[y].size + 1 < k){
k -= tr[y].size + 1;
x = tr[x].s[1];
}
else if(tr[y].size >= k) x = y;
else return x;
}
}
void pushup(int x){
tr[x].size = tr[tr[x].s[0]].size
+ tr[tr[x].s[1]].size + 1;
}
void rotate(int x){
int y = tr[x].p, z = tr[y].p;
int k = tr[y].s[1] == x;
tr[z].s[tr[z].s[1] == y] = x;
tr[x].p = z, tr[y].p = x;
tr[y].s[k] = tr[x].s[k ^ 1];
tr[tr[x].s[k ^ 1]].p = y;
tr[x].s[k ^ 1] = y;
pushup(y), pushup(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[0] == x) ^ (tr[z].s[0] == y)
? rotate(y) : rotate(x);
}
rotate(x);
}
if(k == 0) root = x;
}
void insert(int v){
int x = root, p = 0;
while(x)p = x, x = tr[x].s[v > tr[x].v];
x = ++ idx;
tr[p].s[v > tr[p].v] = x;
tr[x].init(p, v);
splay(x, 0);
}
void output(int x){
pushdown(x);
if(tr[x].s[0]) output(tr[x].s[0]);
if(tr[x].v >= 1 && tr[x].v <= n)
printf("%d ", tr[x].v);
if(tr[x].s[1]) output(tr[x].s[1]);
}
int main(){
scanf("%d%d", &n, &q);
insert(-1e6), insert(1e6);
for(int i = 1;i <= n;i ++) insert(i);
while(q --){
int l, r;
scanf("%d%d", &l, &r);
l = get_k(l), r = get_k(r + 2);
splay(l, 0), splay(r, l);
tr[tr[r].s[0]].tag ^= 1;
}
output(root);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理