博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3223 文艺平衡树 codevs3303 翻转区间
阅读量:7280 次
发布时间:2019-06-30

本文共 1251 字,大约阅读时间需要 4 分钟。

splay模版题吧 只有区间翻转
至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有大于x的点而y的左边是所有小于y的点 这样刚好包涵了所需要翻转的区间
#include
#include
#include
using namespace std;const int M=100005;int n,m,root;int c[M][2],fa[M],size[M];bool rev[M];void pushup(int k){
int l=c[k][0],r=c[k][1]; size[k]=size[l]+size[r]+1;}void pushdown(int k){ int l=c[k][0],r=c[k][1]; if(rev[k]){ swap(c[k][0],c[k][1]); rev[l]^=1; rev[r]^=1; rev[k]=0; }}void build(int l,int r,int f){ if(l>r) return ; if(l==r){ fa[l]=f; size[l]=1; if(l
>1; build(l,mid-1,mid); build(mid+1,r,mid); fa[mid]=f; pushup(mid); if(mid
=rank) return find(l,rank); else return find(r,rank-size[l]-1);}void rever(int l,int r){ int x=find(root,l),y=find(root,r+2); splay(x,root); splay(y,c[root][1]); rev[c[y][0]]^=1;}int main(){ scanf("%d %d",&n,&m); build(1,n+2,0); root=(n+3)>>1; while(m--){ int l,r; scanf("%d %d",&l,&r); rever(l,r); } for(int i=2;i<=n+1;i++) printf("%d ",find(root,i)-1); return 0;}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/6910154.html

你可能感兴趣的文章
tortoisegit 怎么Merge、怎么删除分支
查看>>
在EF中直接执行SQL语句
查看>>
怎么对字段很多的表写Dto
查看>>
kNN与kMeans聚类算法的区别
查看>>
微信小程序实现简易留言板
查看>>
每周个人进度总结11
查看>>
[04-08] list-style-type,无序列表 & 有序列表
查看>>
深入理解哈希表
查看>>
typescript 类(类的定义、继承、修饰符、抽象类)
查看>>
linux---网络配置
查看>>
微服务之SpringCloud基础
查看>>
UVA - 10635 Prince and Princess
查看>>
PHP服务器端防止用户重复提交数据
查看>>
javascript 中用到的时间戳函数
查看>>
easyui window refresh 刷新两次解决办法
查看>>
P2325 [SCOI2005]王室联邦
查看>>
第一次使用微软的企业库就遇上麻烦
查看>>
在Web应用中接入微信支付的流程之极简清晰版 (转)
查看>>
HDU 2036 改革春风吹满地[多边形的面积]
查看>>
多项式全家桶
查看>>