[校内训练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
原文地址:https://www.cnblogs.com/GreenDuck/p/11554918.html