C06【模板】FHQ Treap P3391 文艺平衡树
视频链接:264【模板】FHQ Treap P3391 文艺平衡树_哔哩哔哩_bilibili
#include <iostream> using namespace std; const int N=100010; struct node{ int l,r; //左右儿子 int val; //树的权值 int key; //堆的随机值 int size; //子树大小 int tag; //懒标记 }tr[N]; int n,m,root,idx; int newnode(int v){ tr[++idx].val=v; tr[idx].key=rand(); tr[idx].size=1; return idx; } void pushup(int p){ tr[p].size=tr[tr[p].l].size +tr[tr[p].r].size+1; } void pushdown(int p){ if(!tr[p].tag||!p) return; swap(tr[p].l, tr[p].r); tr[tr[p].l].tag ^= 1; tr[tr[p].r].tag ^= 1; tr[p].tag = 0; } void split(int p,int k,int &x,int &y){ if(!p) {x=y=0; return;} pushdown(p); if(k>tr[tr[p].l].size){ k-=tr[tr[p].l].size+1; x=p; split(tr[p].r,k,tr[p].r,y); } else{ y=p; split(tr[p].l,k,x,tr[p].l); } pushup(p); } int merge(int x,int y){ if(!x||!y) return x+y; if(tr[x].key<tr[y].key){ pushdown(x); tr[x].r=merge(tr[x].r,y); pushup(x); return x; } else{ pushdown(y); tr[y].l=merge(x,tr[y].l); pushup(y); return y; } } void reverse(int l,int r){ int x,y,z; split(root,r,x,z); split(x,l-1,x,y); tr[y].tag ^= 1; //标记 root=merge(merge(x,y),z); } void output(int p){ if(!p) return; pushdown(p); output(tr[p].l); printf("%d ",tr[p].val); output(tr[p].r); } int main(){ srand(time(0)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) root=merge(root,newnode(i)); for(int x,y,i=1;i<=m;i++){ scanf("%d%d",&x,&y); reverse(x, y); } output(root); return 0; }
分类:
C 数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!