COJ 0018 移动盒子

20605移动盒子
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

你有一行盒子,从左到右依次编号为1,2,3,……,n。可以执行一下四种指令:
    1、1 X Y表示将盒子 X 移动到盒子 Y 的左边。(如果X已经在Y的左边则忽略此指令)
    2、2 X Y表示把盒子X移动到盒子Y的右边。(如果X已经在Y的右边则忽略此指令)
    3、3 X Y表示交换盒子X和Y的位置。
    4、4表示反转整条链。
输入指令保证合法,即X不等于Y。


输入

第一行包括两个正整数n和m,分别表示盒子个数和指令条数,接下来的m行,每行一条指令,如果是指令1、2或者3时,三部分间有一个空格分隔,如指令1 2 4表示将盒子2移动到盒子4的左边。

输出

一个正整数,表示所有奇数位置上盒子编号的数字之和。

输入示例

6 4
1 1 4
2 3 5
3 1 6
4

输出示例

12

其他说明

样例说明:当n=6时,在初始状态下执行1 1 4后,盒子序列为2 3 1 4 5 6,接下来执行2 3 5后,盒子序列变成2 1 4 5 3 6,再执行3 1 6,得到2 6 4 5 3 1,最终执行4,得到1 3 5 4 6 2。
0 < n, m < 100001

题解:赤裸裸的链表,可惜我没有写。我写的是splay tree你们怕不怕!!!

写完真的是太爽了。。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cstring>
  7 #define PAU putchar(‘ ‘)
  8 #define ENT putchar(‘\n‘)
  9 #define CH for(int d=0;d<=1;d++) if(ch[d])
 10 using namespace std;
 11 const int maxn=100000+10;
 12 struct node{
 13     node*fa,*ch[2];
 14     int c;bool rev;int siz;
 15     node(){c=-1;rev=false;siz=1;}
 16     void revt(){swap(ch[0],ch[1]);rev^=1;return;}
 17     void update(){siz=1;CH{siz+=ch[d]->siz;}return;}
 18     void down(){if(rev){CH{ch[d]->revt();}rev=false;}return;}
 19 }Splay[maxn],*root;int cnt=0;
 20 int parent(node*x,node*&y){return (y=x->fa)?y->ch[1]==x?1:y->ch[0]==x?0:-1:-1;}
 21 void rotate(node*x){
 22     node*y,*z;int d1=parent(x,y),d2=parent(y,z);
 23     if(y->ch[d1]=x->ch[d1^1]) y->ch[d1]->fa=y;
 24     y->fa=x;x->fa=z;x->ch[d1^1]=y;
 25     if(d2!=-1) z->ch[d2]=x;
 26     y->update();return;
 27 }
 28 void pushdown(node*x){
 29     static node*s[maxn];int top=0;
 30     for(node*y;;x=y){
 31         s[top++]=x;y=x->fa;
 32         if(!y||(y->ch[0]!=x&&y->ch[1]!=x)) break;
 33     } while(top--) s[top]->down();return;
 34 }
 35 node*splay(node*x){
 36     pushdown(x);node*y,*z;int d1,d2;
 37     while(true){
 38         if((d1=parent(x,y))<0) break;
 39         if((d2=parent(y,z))<0){rotate(x);break;}
 40         if(d1==d2) rotate(y),rotate(x);
 41         else rotate(x),rotate(x);
 42     } x->update();return x;
 43 }
 44 node*find(node*x,int rank){
 45     x->down();int kth=1;if(x->ch[0]) kth=x->ch[0]->siz+1;
 46     if(rank==kth) return x;
 47     if(rank<kth) return find(x->ch[0],rank);
 48     else return find(x->ch[1],rank-kth);
 49 }
 50 void split(node*&x,node*&y,int a){
 51     if(!a){y=x;x=NULL;return;}
 52     x=splay(find(x,a));y=x->ch[1];
 53     x->ch[1]=NULL;if(y)y->fa=NULL;x->update();return;
 54 }
 55 void split(node*&x,node*&y,node*&z,int a,int b){
 56     split(x,z,b);split(x,y,a-1);return;
 57 }
 58 void join(node*&x,node*y){
 59     if(!x){x=y;return;}if(!y)return;
 60     x=splay(find(x,x->siz));x->ch[1]=y;
 61     if(y)y->fa=x;x->update();return;
 62 }
 63 void join(node*&x,node*y,node*z){
 64     join(y,z);join(x,y);return;
 65 }
 66 int A[maxn],n,Q;
 67 void build(node*&x,int L,int R){
 68     if(L>R)return;int M=L+R>>1;
 69     x=&Splay[cnt++];x->c=A[M];
 70     build(x->ch[0],L,M-1);
 71     build(x->ch[1],M+1,R);
 72     if(x->ch[0]) x->ch[0]->fa=x;
 73     if(x->ch[1]) x->ch[1]->fa=x;
 74     x->update();return;
 75 }
 76 void reverse(int L,int R){
 77     node*x,*y;split(root,x,y,L,R);x->revt();join(root,x,y);return;
 78 }
 79 node*findll(node*x,int a){
 80     if(!x) return NULL;x->down();
 81     if(x->c==a) return x;
 82     node*t;
 83     if((t=findll(x->ch[0],a))||(t=findll(x->ch[1],a))) return t;
 84     return NULL;
 85 }
 86 void printer(node*x){
 87     if(!x){printf("NULL ");return;}
 88     x->down();
 89     if(x->ch[0])printer(x->ch[0]);
 90     printf("%d ",x->c);
 91     if(x->ch[1])printer(x->ch[1]);
 92     return;
 93 }
 94 int cz=1;long long sum=0;
 95 void counter(node*x){
 96     if(!x){return;}
 97     x->down();
 98     if(x->ch[0])counter(x->ch[0]);
 99     if((cz++)&1) sum+=x->c;
100     if(x->ch[1])counter(x->ch[1]);
101     return;
102 }
103 node*findfa(node*x){
104     while(x->fa) x=x->fa;return x;
105 }
106 int findpos(int a){
107     for(int i=1;i<=n;i++) if(A[i]==a) return i;
108     return -1;
109 }
110 void split(node*&t1,node*&x,node*&t2,node*&y,node*&t3,int a,int b){
111     splay(t1);
112     x=findll(t1,a),y=findll(t1,b);
113     splay(x);int kth1=1;if(x->ch[0]) kth1=x->ch[0]->siz+1;
114     splay(y);int kth2=1;if(y->ch[0]) kth2=y->ch[0]->siz+1;
115     if(kth1>kth2) swap(kth1,kth2);
116     splay(t1);split(t1,x,t2,kth1,kth1);
117     kth2-=kth1;split(t2,y,t3,kth2,kth2);return;
118 }
119 void join(node*&t1,node*x,node*t2,node*y,node*t3){
120     join(t2,y,t3);join(t1,x,t2);return;
121 }
122 void swapnode(int a,int b){
123     node*t1,*t2,*x,*y;
124     split(root,x,t1,y,t2,a,b);
125     join(root,y,t1,x,t2);return;
126 }
127 void shift(int a,int b,int tp){//1 right 0 left
128     node*t1,*t2,*x,*y;
129     split(root,x,t1,y,t2,a,b);
130     y->ch[tp]=x;x->fa=y;y->update();
131     join(root,NULL,t1,y,t2);return;
132 }
133 inline int read(){
134     int x=0,sig=1;char ch=getchar();
135     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
136     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
137     return x*=sig;
138 }
139 inline void write(int x){
140     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
141     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
142     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
143 }
144 inline void write(long long x){
145     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
146     int len=0;long long buf[15];while(x)buf[len++]=x%10,x/=10;
147     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
148 }
149 void init(){
150     n=read();Q=read();
151     for(int i=1;i<=n;i++) A[i]=i;
152     build(root,1,n);int tp,a,b;
153     while(Q--){
154         tp=read();
155         if(tp==4) root->revt();
156         else{
157             a=read();b=read();
158             if(tp==3) swapnode(a,b);
159             else shift(a,b,tp-1);
160         }
161     }
162     counter(root);
163     write(sum);
164     return;
165 }
166 void work(){
167     return;
168 }
169 void print(){
170     return;
171 }
172 int main(){init();work();print();return 0;}
时间: 2024-09-29 18:10:26

COJ 0018 移动盒子的相关文章

深度理解div+css布局嵌套盒子

1. 网页布局概述 网页布局的概念是把即将出现在网页中的所有元素进行定位,而CSS网页排版技术有别于传统的网页排版方法,它将页面首先在整体上使用<div>标记进行分块,然后对每个快进行CSS定位以及设置显示效果,最后在每个块中添加相应的内容.利用CSS排版方法更容易地控制页面每个元素的效果,更新也更容易,甚至页面的拓扑结构也可以通过修改相应的CSS属性来重新定位.  2. 盒子模型 盒子模型是CSS控制页面元素的一个重要概念,只有掌握了盒子模型,才能让CSS很好地控制页面上每一个元素,达到我们

CSS3的新特性 行内盒子before和after

CSS3的新特性 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>before after</title> 6 <style type="text/css"> 7 /*在DIV1盒子内部前面*/ 8 #div1:before{ 9 width: 100p

盒子模型

每个div 都是一个盒子, 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta htt

css未知宽高的盒子div居中的多种方法

不知道盒子大小.宽高时,如何让盒子上下左右居中? 应用场景:比如上传图片时,并不知道图片的大小,但要求图片显示在某盒子的正中央. 方法1:让4周的拉力均匀-常用 <!-- Author: XiaoWen Create a file: 2017-01-13 13:46:47 Last modified: 2017-01-13 14:05:04 Start to work: Finish the work: Other information: --> <!DOCTYPE html>

理解CSS盒子模型

什么是CSS的盒子模式呢?为什么叫它是盒子?先说说我们在网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以把它转移到我们日常生活中的盒子(箱子)上来理解,日常生活中所见的盒子也具有这些属性,所以叫它盒子模式.那么内容就是盒子里装的东西:而填充就是怕盒子里装的东西(贵重的)损坏而添加的泡沫或者其它抗震的辅料:边框就是盒子本身了:至于边界则说明盒子摆放的时候的不能全部堆在一起,要留一定

点击空白处隐藏盒子

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>点击空白处隐藏盒子</title> <style> #mask{ width: 100%; height:2000px; font-weight:bold;">#000; opacity: 0.4; filter:alpha(opac

HTML盒子模型

一.什么是盒子模型? CSS中, Box Model叫盒子模型(或框模型), Box Model规定了元素框处理元素内容(element content). 内边距(padding).边框(border) 和 外边距(margin) 的方式 二.第一层边框--border的常用属性 1.border-color--边框颜色 2.border-style--边框样式 dashed:虚线;solid:细线 3.border-width--边框宽度,单位像素px 4.border:粗细,颜色,样式 三

关于W3C盒子布局

在学校老师出国一道题: 第一个div盒子,id为box, 宽度300px, 第二个div盒子在第一个div盒子的内部,id为div1,宽度200px, 第三个div盒子在第一个div盒子的内部,id为div2,宽度需计算, 三个盒子的border:1px solid red; 左浮动, 内外边距各5px 这道题主要是考盒子的计算: <!doctype html> <html lang="ch"> <head> <meta charset=&qu

CSS盒子模型

1.盒子模型 2.内边距 设置内边距 属性 描述 padding 设置所有边距 padding-left 设置左边距 padding-right 设置右边距 padding-bottom 设置上边距 padding-top 设置底边距 3.CSS边框 我们可以创建出效果出色的边框,并且可以应用于任何元素 边框样式: border-style:定义了10个不同的非继承样式,包括none 边框的单边样式: border-top-style: border-lef-style: border-righ