zoukankan      html  css  js  c++  java
  • 排序(sortb)

    题目描述

    懒得写题目背景了,就不写了。
    有一个 $0, 1 dots n − 1$ 的排列 $p_1, p_2 dots p_n$,如果 $p_i ⊕ p_j ≤ a$(其中 $⊕$ 为按位异或),你就可以交换 $p_i$ 和 $p_j$。你希望通过若干次操作把它排序。但是,你还没有定下 a 的值,你想知道能够成功排序情况下最小的非负整数 a。
    为了让题目更难,有时候会对排列进行更新,每次更新是交换某对 $p_i$ 和 $p_j$。在每次更新后你都要需要输出最小的 $a$。
     
    第一行输入 $n$ 和 $m$,$m$ 是更新的个数。
    接下来 $m$ 行,每行两个整数 $i, j$,表示交换 $p_i$ 和 $p_j$。

     

    对于所有数据,$1 ≤ n, m ≤ 500000$,对于每个更新 $1 ≤ i, j ≤ n,i eq j$。
    $Subtask 1(10pts):n, m ≤ 5。$ 
    $Subtask 2(20pts):n, m ≤ 300。$ 
    $Subtask 3(20pts):m = 1。$ 
    $Subtask 4(20pts):n, m ≤ 50000。$ 
    $Subtask 5(30pts):无特殊限制。$
     

    solution
    考虑排序1~7 的最小代价。
    是4 。因为跨过4的可以让它刚好等于4
     
    可以发现 $ 2^i $ 足够覆盖 $ 2^{i+1}-1$
    那么我们可以两两求出i,j交换的代价 输出所有的最大代价(也就是最高位)即可。
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cmath>
     7 using namespace std;
     8 int n,m,p[500005],bin[22],dy[500005];
     9 int get(int v){
    10     for(int i=20;i>=0;i--)if(v&(1<<i))return i;
    11     return 21;
    12 }
    13 int main()
    14 {
    15     cin>>n>>m;
    16     for(int i=0;i<n;i++)scanf("%d",&p[i]),dy[p[i]]=i;
    17     for(int i=0;i<n;i++){
    18         bin[get(i^p[i])]++;
    19     }
    20     for(int i=1,t1,t2;i<=m;i++){
    21         
    22         scanf("%d%d",&t1,&t2);
    23         t1--,t2--;
    24         bin[get(t1^p[t1])]--;
    25         bin[get(t2^p[t2])]--;
    26         swap(p[t1],p[t2]);
    27         bin[get(t1^p[t1])]++;
    28         bin[get(t2^p[t2])]++;
    29         int fl=0;
    30         for(int j=20;j>=0;j--)if(bin[j]){
    31             printf("%d
    ",(1<<j));fl=1;
    32             break;
    33         }
    34         if(!fl)puts("0");
    35     }
    36     return 0;
    37 }
    View Code
     
  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/liankewei/p/10591283.html
Copyright © 2011-2022 走看看