• BNUOJ 26474 Bread Sorting


     1 /*给出n个原始顺序的数,再给出要排成目标状态顺序,每次从第一个数列中选择三个,把这三个数中最右边的数放在最左边,然后其他两个数右
     2 移一个单位,为你从原始状态能不能排序成目标状态。
     3 本人YY的结论,从特殊到一般,虽然一般的只是手证了数值比较小的:结论应该就是1到n的n个数的全排列,分成相等的奇排序和偶排序,且个数一样,同个集合中的排列可以互相转换
     4 比如1 2 3 4的全排1 2 3 4
     5 1 4 2 3
     6 1 3 4 2
     7 4 1 3 2
     8 4 2 1 3
     9 4 3 2 1
    10 2 4 3 1
    11 2 1 4 3
    12 2 3 1 4
    13 3 4 1 2(可由4 1 3 2变成,一样的)
    14 3 2 4 1
    15 3 1 2 4
    16 这个偶排序占了12个,其他十二个是奇排序
    17 所以这道题直接比较两个数列的奇偶性
    18 */
    19 #include<stdio.h>
    20 #include<string.h>
    21 #include<algorithm>
    22 using namespace std;
    23 const int maxn=100010;
    24 int a[maxn],b[maxn],c[maxn];
    25 int n;
    26 struct point
    27 {
    28     int num,index;
    29 }p[maxn];
    30 int cmp(const point a,const point b)
    31 {
    32     return a.num<b.num;
    33 }
    34 int lowbit(int x)
    35 {
    36     return x&(-x);
    37 }
    38 void updata(int i,int x)
    39 {
    40     while(i<=n)
    41     {
    42         c[i]+=x;
    43         i=i+lowbit(i);
    44     }
    45 }
    46 int sum(int x)
    47 {
    48     int ans=0;
    49     while(x>0)
    50     {
    51        ans+=c[x];
    52        x=x-lowbit(x);
    53     }
    54     return ans;
    55 }
    56 int main()
    57 {
    58     int i,j;
    59     while(scanf("%d",&n)!=EOF)
    60     {
    61         memset(c,0,sizeof(c));
    62         for(i=1;i<=n;i++)
    63         {
    64             scanf("%d",&p[i].num);
    65             p[i].index=i;
    66         }
    67         sort(p+1,p+n+1,cmp);
    68         for(i=1;i<=n;i++)
    69             b[p[i].index]=i;
    70             
    71         int ans1=0,ans2=0;
    72         for(i=1;i<=n;i++)
    73         {
    74             updata(b[i],1);
    75             ans1=ans1+(sum(n)-sum(b[i]));//sum(p[i])是前面比b[i]小的数的个数
    76         }
    77         memset(c,0,sizeof(c));
    78         memset(p,0,sizeof(p));
    79         memset(b,0,sizeof(b));
    80         for(i=1;i<=n;i++)
    81         {
    82             scanf("%d",&p[i].num);
    83             p[i].index=i;
    84         }
    85         sort(p+1,p+n+1,cmp);
    86         for(i=1;i<=n;i++)
    87             b[p[i].index]=i;
    88         
    89         for(i=1;i<=n;i++)
    90         {
    91             updata(b[i],1);
    92             ans2=ans2+(sum(n)-sum(b[i]));
    93         }
    94         printf("%d %d
    ",ans1,ans2);
    95         if(ans1%2==ans2%2) printf("Possible
    ");
    96         else printf("Impossible
    ");
    97     }
    98     return 0;
    99 }
    PS:这道题置换群也可以破
    有奇数个有偶数个元素的轮换就是不可以
    有偶数个有偶数个元素的轮换就是可以
  • 相关阅读:
    SQL 执行进展优化
    初识SQL 执行顺序
    前端模块化开发的价值(转)
    js 闭包之一
    js模块开发(一)
    简单说说call 与apply
    js 爱恨情仇说 this
    说说 js String
    $Ajax简单理解
    SQL-如何使用 MongoDB和PyMongo。
  • 原文地址:https://www.cnblogs.com/okboy/p/3281763.html
Copyright © 2020-2023  润新知