您的位置:首页 > 其它

简单处理Problem 3223. -- Tyvj 1729 文艺平衡树

2017-08-10 16:30 295 查看

Problem Description

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 

Input

第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n 

Output

 
输出一行n个数字,表示原始序列经过m次变换后的结果 

Sample Input

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5

Hint

N,M<=100000

Submit

Discuss

#include<iostream>

#include<stdio.h>

using namespace std;

int num[100000];

//int change[100000][2];

int temp;

/*void swwap(int a,int b)

{

 temp = a;

 a=b;

 b = temp;

}

*/

void changesequence1(int l,int r)//   1 2 3

{

 int mid = (l+r)/2;

 for(int i=l;i<mid;i++)

 {

  temp = num[i-1];

  num[i-1] = num[mid-i+mid-1];

  num[mid-i+mid-1] = temp;

  

 }

}

void changesequence2(int l,int r)//   1 2 3 4

{

 int mid = (l+r)/2;

 for(int i=l;i<=mid;i++)

 {

  temp = num[i-1];

  num[i-1] = num[mid-i+mid];

  num[mid-i+mid] = temp;

 

 }

}

int main()

{

 int n,m;

 int p,q;

 scanf("%d%d",&n,&m);

 for(int i=0;i<n;i++)

 {

  num[i] = i+1;

 }

 for(int i=0;i<m;i++)

 {

  scanf("%d%d",&p,&q);

  if((q-p)%2 == 0)   //奇数个变

   changesequence1(p,q);

  else

   changesequence2(p,q);
 }

 

 for(int i=0;i<n-1;i++)

 {

  printf("%d ",num[i]);

 }

 printf("%d",num[n-1]);

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: