zoukankan      html  css  js  c++  java
  • [校内训练19_09_10]sort

    题意

    给一个非负整数序列,每次问能否异或上一个正整数使得所有的数单调不减。如果能,输出最小的x,否则输出-1。单点修改。多测。要求最多一个log。


    思考

    只要考虑相邻的两个数。找到这两个数最高的不同的一位,那么只要考虑是一定要异或或者是一定不要异或。


    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1E6+5;
     4 const int base=30;
     5 int n,m;
     6 int a[maxn],bucket[55][2];
     7 inline int read()
     8 {
     9     char ch=getchar();
    10     while(!isdigit(ch))
    11         ch=getchar();
    12     int sum=ch-'0';
    13     ch=getchar();
    14     while(isdigit(ch))
    15     {
    16         sum=sum*10+ch-'0';
    17         ch=getchar();
    18     }
    19     return sum;
    20 }
    21 void write(int x)
    22 {
    23     if(x>=10)
    24         write(x/10);
    25     putchar('0'+x%10);
    26 }
    27 inline void writen(int x)
    28 {
    29     if(x<0)
    30         putchar('-'),x=-x;
    31     write(x);
    32     putchar('
    ');
    33 }
    34 inline int highbit(int x)
    35 {
    36     for(int i=base;i>=0;--i)
    37         if(x&(1<<i))
    38             return i;
    39 }
    40 inline void add(int x,int y,int v)
    41 {
    42     if(x==y)
    43         return;
    44     bucket[highbit(x^y)][x>y]+=v;
    45 }
    46 inline void solve()
    47 {
    48     int sum=0;
    49     for(int i=0;i<=base;++i)
    50     {
    51         if(bucket[i][0]&&bucket[i][1]){sum=-1;break;}
    52         else if(bucket[i][1])
    53             sum+=(1<<i);
    54     }
    55     writen(sum);
    56 }
    57 int main()
    58 {
    59     ios::sync_with_stdio(false);
    60     n=read();
    61     for(int i=1;i<=n;++i)
    62         a[i]=read();
    63     for(int i=1;i<n;++i)
    64         add(a[i],a[i+1],1);
    65     m=read();
    66     solve();
    67     while(m--)
    68     {
    69         int x=read(),y=read();
    70         if(x!=1)
    71             add(a[x-1],a[x],-1);
    72         if(x!=n)
    73             add(a[x],a[x+1],-1);
    74         a[x]=y;
    75         if(x!=1)
    76             add(a[x-1],a[x],1);
    77         if(x!=n)
    78             add(a[x],a[x+1],1);
    79         solve();
    80     }
    81     return 0;
    82 }
    View Code
  • 相关阅读:
    Docker Swarm
    服务器虚拟化
    kubernets的工作流程
    配置docker阿里云加速器
    kubeadm 安装kubernetes集群。
    linux的10个最危险的命令
    18个网络带宽常用命令
    column命令
    dd命令
    scp命令
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/11554918.html
Copyright © 2011-2022 走看看