区间翻转(codevs 3243)
给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列
第一行一个数N,下一行N个数表示原始序列,在下一行一个数M表示M次翻转,之后的M行每行两个数L,R表示将区间[L,R]翻转。
一行N个数 , 表示最终序列。
4
1 2 3 4
2
1 2
3 4
2 1 4 3
对于30%的数据满足n<=100 , m <= 10000
对于100%的数据满足n <= 150000 , m <= 150000
对于100%的数据满足n为2的幂,且L = i * 2^j + 1 , R = (i + 1) * 2^j
最初自己写了一个,然后怎么调也调不出来,明天再战:
- #include<cstdio>
- #include<iostream>
- #define N 150010
- using namespace std;
- int son[N][],fa[N],val[N],order[N],rev[N],sz[N],n,m,rt,size;
- void pushup(int x){
- if(!x)return;
- sz[x]=sz[son[x][]]+sz[son[x][]]+;
- }
- void pushdown(int x){
- swap(son[x][],son[x][]);
- rev[son[x][]]^=;rev[son[x][]]^=;
- rev[x]^=;
- }
- void rotate(int x,int &k){
- int y=fa[x],z=fa[y],l,r;
- if(son[y][]==x)l=;else l=;r=l^;
- if(y==k)k=x;
- else {
- if(son[z][]==y) son[z][]=x;
- else son[z][]=x;
- }
- fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
- son[y][l]=son[x][r];son[x][r]=y;
- pushup(y);pushup(x);
- }
- void splay(int x,int &k){
- while(x!=k){
- int y=fa[x],z=fa[y];
- if(y!=k){
- if((son[y][]==x)^(son[z][]==y)) rotate(x,k);
- else rotate(y,k);
- }
- rotate(x,k);
- }
- }
- void insert(int hao,int v){
- int k=rt,y=;
- while(k)y=k,k=son[k][hao>order[k]];
- k=++size;fa[k]=y;son[y][v>order[y]]=k;val[k]=v;order[k]=hao;sz[k]=;
- splay(k,rt);
- }
- int find(int x){
- int k=rt;
- while(){
- if(rev[k])pushdown(k);
- if(sz[son[k][]]+==x)return k;
- if(sz[son[k][]]>=x) k=son[k][];
- else x-=(sz[son[k][]]+),k=son[k][];
- }
- }
- void rever(int x,int y){
- if(x==&&y==n)rev[rt]^=;
- if(x==&&y<n){
- int p=find(y+);
- splay(p,rt);rev[son[rt][]]^=;
- }
- if(y==n&&x>){
- int p=find(x-);
- splay(p,rt);rev[son[rt][]]^=;
- }
- if(x>&&y<n){
- int p;
- p=find(x-);splay(p,rt);
- p=find(y+);splay(p,son[rt][]);
- rev[son[son[rt][]][]]^=;
- }
- }
- void dfs(int k){
- if(!k)return;
- if(rev[k])pushdown(k);
- dfs(son[k][]);
- printf("%d ",val[k]);
- dfs(son[k][]);
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- int x;scanf("%d",&x);
- insert(i,x);
- }
- scanf("%d",&m);
- for(int i=;i<=m;i++){
- int x,y;scanf("%d%d",&x,&y);
- //if(i==1)continue;
- rever(x,y);
- }
- dfs(rt);
- return ;
- }
比着黄学长写了一个:
- #include<cstdio>
- #include<iostream>
- #define N 150010
- using namespace std;
- int fa[N],son[N][],id[N],sz[N],rev[N],val[N];
- int n,m,size,rt;
- void pushup(int k){
- int l=son[k][],r=son[k][];
- sz[k]=sz[l]+sz[r]+;
- }
- void pushdown(int k){
- int l=son[k][],r=son[k][];
- if(rev[k]){
- swap(son[k][],son[k][]);
- rev[l]^=;rev[r]^=;
- rev[k]=;
- }
- }
- void rotate(int x,int &k){
- int y=fa[x],z=fa[y],l,r;
- if(son[y][]==x)l=;else l=;r=l^;
- if(y==k)k=x;
- else {
- if(son[z][]==y) son[z][]=x;
- else son[z][]=x;
- }
- fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
- son[y][l]=son[x][r];son[x][r]=y;
- pushup(y);pushup(x);
- }
- void splay(int x,int &k){
- while(x!=k){
- int y=fa[x],z=fa[y];
- if(y!=k){
- if((son[y][]==x)^(son[z][]==y)) rotate(x,k);
- else rotate(y,k);
- }
- rotate(x,k);
- }
- }
- int find(int k,int rank){
- pushdown(k);
- int l=son[k][],r=son[k][];
- if(sz[l]+==rank)return k;
- else if(sz[l]>=rank) return find(l,rank);
- else return find(r,rank-sz[l]-);
- }
- void rever(int l,int r){
- int x=find(rt,l),y=find(rt,r+);
- splay(x,rt);splay(y,son[x][]);
- int z=son[y][];rev[z]^=;
- }
- void build(int l,int r,int f){
- if(l>r)return;
- int now=id[l],last=id[f];
- if(l==r){
- fa[now]=last;sz[now]=;
- if(l<f)son[last][]=now;
- else son[last][]=now;
- return;
- }
- int mid=l+r>>;now=id[mid];
- build(l,mid-,mid);build(mid+,r,mid);
- fa[now]=last;pushup(mid);
- if(mid<f)son[last][]=now;
- else son[last][]=now;
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<=n+;i++)
- id[i]=++size;
- val[]=-0x7fffffff;val[n+]=0x7fffffff;
- for(int i=;i<=n+;i++)
- scanf("%d",&val[i]);
- build(,n+,);rt=(n+)>>;
- scanf("%d",&m);
- for(int i=;i<=m;i++){
- int l,r;scanf("%d%d",&l,&r);
- rever(l,r);
- }
- for(int i=;i<=n+;i++)
- printf("%d ",val[find(rt,i)]);
- return ;
- }
区间翻转(codevs 3243)的更多相关文章
- [BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转
题目不说了,就是区间翻转 传送门:BZOJ 3223 和 CodeVS 3243 第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...
- WIKIOI 3243 区间翻转
3243 区间翻转 题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列 输入描述 Input Description 第一行一个数N ...
- CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)
4655 序列终结者 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 网上有许多题,就是给定一个序列,要 ...
- codevs3243 区间翻转
题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列 输入描述 Input Description 第一行一个数N,下一行N个数表示原 ...
- hdu-3487-Play with Chain-(splay 区间翻转,切割,插入)
题意: 区间翻转,切割,插入 // File Name: ACM/HDU/3487.cpp // Author: Zlbing // Created Time: 2013年08月10日 星期六 21时 ...
- hdu-1890-Robotic Sort splay区间翻转
题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- [置顶] hdu 1890 伸展树区间翻转
题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转. 思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组 ...
- hdu3397区间覆盖,区间翻转,区间合并,区间求和
调了很久的代码..注意区间翻转和覆盖的操作互相的影响 /* 区间替换操作怎么搞? 应该是加个tag标记 如果整个区间都是0|1,那么把若有tag的话直接set1|0即可,也不用设置tag标记 反之要设 ...
随机推荐
- Jquery 错误提示插件
这是一个简单的输入框错误提示插件,可拓展! .jq-error{ font-size:12px; min-width:150px; width:auto; max-width:350px; line- ...
- initWithNibName/awakeFromNib/initWithCoder
转自: http://leeyin.iteye.com/blog/1040362 每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似 ...
- 基于Python的Web应用开发实战——2 程序的基本结构
2.1 初始化 所有Flaks程序都必须创建一个程序实例. Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所 ...
- OpenCV2:介绍
一.OpenCV简介 OpenCV所有的类和函数都在cv命名空间里面,可以用 using namespace cv; #include "opencv2/opencv.hpp" 1 ...
- Django-C001-快速入门
此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. Django Django是一个开放源码的We ...
- CS193p Lecture 6 - UINavigation, UITabBar
抽象类(Abstract):指的是这个类不能被实例化,只能被继承: OC中没有关键词来标明某个类是抽象类,只能在注释中标注一下: 抽象类中的抽象方法,必须是public的,使方法称为public的方法 ...
- java获取本地计算机MAC地址
java获取本地计算机MAC地址代码如下: public class SocketMac { //将读取的计算机MAC地址字节转化为字符串 public static String transByte ...
- 如何用纯 CSS 创作一个均衡器 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oybWBy 可交互视频教 ...
- FIFO设计思考之一
不管同步FIFO还是异步FIFO,设计难点是full/empty状态flag的正确性. 要保证任何情况 FULL时NO WRITE,EMPTY时NO READ.overflow / underflow ...
- 【php】 php 的注释和结束符号之间的关系
Closing PHP tags are recognised within single-line comments: <?php // Code will end here ?> ...