QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#376529#6631. Maximum Bitwise ORfzxTL 477ms9916kbC++145.0kb2024-04-04 11:20:582024-04-04 11:21:00

Judging History

你现在查看的是最新测评结果

  • [2024-04-04 11:21:00]
  • 评测
  • 测评结果:TL
  • 用时:477ms
  • 内存:9916kb
  • [2024-04-04 11:20:58]
  • 提交

answer

#include <bits/stdc++.h>
#define int long long 
#define pb push_back
using namespace std;
const int INF=1e5+5;
int n,q,a[INF],d[35],vis[INF],LL,RR;
vector <int> e2[35];
struct Segment{
    #define ll tl[id]
    #define rr tr[id]
    #define ls(x) x<<1
    #define rs(x) x<<1|1
    int tl[INF<<2],tr[INF<<2],sum[INF<<2][35];
    void push_up(int id) {
        for (int i=LL;i<RR;i++)
            sum[id][i]=max(sum[ls(id)][i],sum[rs(id)][i]);    
    }
    void build(int l,int r,int id) {
        ll=l;rr=r;
        if (ll==rr) {
            int r=0;
            for (int i=0;i<30;i++) {
                if ((a[ll]>>i)&1) {sum[id][i]=-1;r=i;continue;}
                while (r+1<30 && !((a[ll]>>(r+1))&1)) r++;
                if ((a[ll]>>(r+1))&1) sum[id][i]=r;    
                else sum[id][i]=-1;   
            }
            // if (l==6) cerr<<sum[id][1]<<" qwq?\n";
            return ;
        }
        int Mid=(ll+rr)>>1;
        build(ll,Mid,ls(id));
        build(Mid+1,rr,rs(id));
        push_up(id);
    }
    void add(int l,int r,int v,int id) {
        if (l<=ll && rr<=r) {
            if (v==1) {
                for (int i=0;i<30;i++)
                    sum[id][i]=d[i]; 
            }
            else {
                int r=0;
                for (int i=0;i<30;i++) {
                    if ((a[ll]>>i)&1) {sum[id][i]=-1;r=i;continue;}
                    while (r+1<30 && !((a[ll]>>(r+1))&1)) r++;
                    if ((a[ll]>>(r+1))&1) sum[id][i]=r;    
                    else sum[id][i]=-1;
                }
            }
            return ;
        }
        int Mid=(ll+rr)>>1;
        if (l<=Mid) add(l,r,v,ls(id));
        if (Mid<r) add(l,r,v,rs(id));
        push_up(id);
    }
    void query(int l,int r,int Max,int id) {
        if (l<=ll && rr<=r) {
            d[Max]=max(d[Max],sum[id][Max]);
            return ;
        }
        int Mid=(ll+rr)>>1;
        if (l>Mid) query(l,r,Max,rs(id));
        else if (r<=Mid) query(l,r,Max,ls(id));
        else {query(l,r,Max,ls(id)),query(l,r,Max,rs(id));}
    }
    #undef ll
    #undef rr
    #undef ls
    #undef rs
}T1;
void solve() {
    cin>>n>>q;
    for (int i=0;i<=30;i++) e2[i].clear();
    for (int i=1;i<=n;i++) cin>>a[i];
    for (int i=1;i<=n;i++) {
        for (int j=0;j<30;j++)
            if ((a[i]>>j)&1) e2[j].pb(i);
    }
    LL=0;RR=30;
    T1.build(1,n,1);
    for (int i=1;i<=q;i++) {
        int l=0,r=0;
        cin>>l>>r;
        int Min=30,Max=-1,fl=0,R=0;
        for (int j=0;j<30;j++) {
            int x=upper_bound(e2[j].begin(),e2[j].end(),r)-lower_bound(e2[j].begin(),e2[j].end(),l);
            if (x) R=max(R,j);
        }
        for (int j=0;j<=R;j++) {
            int x=upper_bound(e2[j].begin(),e2[j].end(),r)-lower_bound(e2[j].begin(),e2[j].end(),l);
            if (!x) Min=min(Min,j),Max=max(Max,j);
            if (x==1) vis[*lower_bound(e2[j].begin(),e2[j].end(),l)]++; 
        }
        if (Min>R) {
            cout<<((1ll<<(R+1))-1)<<" 0\n";
            for (int j=0;j<=R;j++) {
                int x=upper_bound(e2[j].begin(),e2[j].end(),r)-lower_bound(e2[j].begin(),e2[j].end(),l);
                if (x==1) vis[*lower_bound(e2[j].begin(),e2[j].end(),l)]=0; 
            }
            continue;
        }
        Max=min(Max,R);
        cout<<((1ll<<(R+1))-1)<<" ";
        LL=Min;RR=Min+1;
        for (int j=0;j<=R;j++) {
            int x=upper_bound(e2[j].begin(),e2[j].end(),r)-lower_bound(e2[j].begin(),e2[j].end(),l);
            if (x==1) {
                int xx=*lower_bound(e2[j].begin(),e2[j].end(),l);
                if (!vis[xx]) continue;
                if (vis[xx]>1) {
                    // cerr<<xx<<" oawjroiqweq\n";
                    vis[xx]=0;
                    for (int p=0;p<30;p++) d[p]=-1;
                    T1.add(xx,xx,1,1);
                }
                else {
                    vis[xx]=0;
                    int L=j;
                    for (int p=j-1;p>=0;p--) 
                        if (!((a[xx]>>p)&1)) L=p;
                        else break;
                    // cerr<<L<<" "<<j<<" "<<Min<<" "<<Max<<" qwq?\n";
                    if (L<=Min && Max<=j) fl=1;
                    for (int p=0;p<30;p++) d[p]=-1;
                    T1.add(xx,xx,1,1);
                }
            }
        }
        for (int p=0;p<30;p++) d[p]=-1;
        T1.query(l,r,Min,1);
        // cerr<<Min<<" "<<Max<<" "<<d[Min]<<" qwq?\n";
        if (d[Min]>=0 && d[Min]>=Max-1) fl=1;   
        for (int j=0;j<30;j++) {
            int x=upper_bound(e2[j].begin(),e2[j].end(),r)-lower_bound(e2[j].begin(),e2[j].end(),l);
            if (x==1) {
                int xx=*lower_bound(e2[j].begin(),e2[j].end(),l);
                T1.add(xx,xx,2,1);
            }
        }
        if (Min>Max) cout<<"0\n";
        else if (fl) cout<<"1\n";
        else cout<<"2\n";
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    int t=0;cin>>t;
    while (t--) solve();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 9836kb

input:

1
3 2
10 10 5
1 2
1 3

output:

15 2
15 0

result:

ok 4 number(s): "15 2 15 0"

Test #2:

score: 0
Accepted
time: 267ms
memory: 9824kb

input:

100000
1 1
924704060
1 1
1 1
149840457
1 1
1 1
515267304
1 1
1 1
635378394
1 1
1 1
416239424
1 1
1 1
960156404
1 1
1 1
431278082
1 1
1 1
629009153
1 1
1 1
140374311
1 1
1 1
245014761
1 1
1 1
445512399
1 1
1 1
43894730
1 1
1 1
129731646
1 1
1 1
711065534
1 1
1 1
322643984
1 1
1 1
482420443
1 1
1 1
20...

output:

1073741823 2
268435455 2
536870911 2
1073741823 2
536870911 2
1073741823 2
536870911 2
1073741823 2
268435455 2
268435455 2
536870911 2
67108863 2
134217727 2
1073741823 2
536870911 2
536870911 2
268435455 2
536870911 2
536870911 2
536870911 2
268435455 2
268435455 2
1073741823 2
16777215 2
10737418...

result:

ok 200000 numbers

Test #3:

score: 0
Accepted
time: 295ms
memory: 9840kb

input:

50000
2 2
924896435 917026400
1 2
1 2
2 2
322948517 499114106
1 2
2 2
2 2
152908571 242548777
1 1
1 2
2 2
636974385 763173214
1 2
1 1
2 2
164965132 862298613
1 1
1 2
2 2
315078033 401694789
1 2
1 2
2 2
961358343 969300127
2 2
1 2
2 2
500628228 28065329
1 2
1 2
2 2
862229381 863649944
1 2
2 2
2 2
541...

output:

1073741823 2
1073741823 2
536870911 2
536870911 2
268435455 2
268435455 2
1073741823 2
1073741823 2
268435455 2
1073741823 2
536870911 2
536870911 2
1073741823 2
1073741823 2
536870911 2
536870911 2
1073741823 2
1073741823 2
1073741823 2
268435455 2
536870911 2
536870911 2
1073741823 2
1073741823 2
...

result:

ok 200000 numbers

Test #4:

score: 0
Accepted
time: 368ms
memory: 9756kb

input:

33333
3 3
925088809 339284112 289540728
3 3
1 3
1 1
3 3
422399522 892365243 216341776
3 3
3 3
1 2
3 3
668932010 837523227 840095874
1 3
1 3
3 3
3 3
731584574 357877180 359063739
1 1
1 1
3 3
3 3
463358343 833924976 847087403
2 3
3 3
1 2
3 3
377154649 772000701 656357011
2 3
1 2
2 3
3 3
977492169 5540...

output:

536870911 2
1073741823 2
1073741823 2
268435455 2
268435455 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
536870911 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
67108863 2
1073741823 2
1073741...

result:

ok 199998 numbers

Test #5:

score: 0
Accepted
time: 382ms
memory: 9916kb

input:

20000
5 5
925473558 183799537 561353092 858424993 765513347
2 4
1 1
1 2
3 5
1 4
5 5
141075166 375934371 754066286 663820319 906342255
3 5
1 1
4 5
1 4
2 3
5 5
417114008 270241961 121113861 381529080 772448388
1 3
1 1
2 5
5 5
2 2
5 5
668136057 138968211 856562545 187058570 699131353
4 5
3 4
5 5
2 4
3 ...

output:

1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
268435455 2
1073741823 2
1073741823 2
1073741823 2
536870911 2
536870911 2
1073741823 2
1073741823 2
536870911 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
1073741823 2
268435455 2
107374...

result:

ok 200000 numbers

Test #6:

score: 0
Accepted
time: 432ms
memory: 9844kb

input:

10000
10 10
464850425 447664857 363029101 653457810 349421643 98326037 214053360 578140626 808807764 145448013
7 9
9 10
8 10
3 7
9 10
5 8
3 3
4 5
5 9
5 6
10 10
164710533 415965867 931056007 328603885 862991829 82082068 344198824 831587464 105221046 931994543
3 10
3 6
2 5
1 8
2 5
2 4
1 4
2 9
4 7
2 10...

output:

1073741823 2
1073741823 2
1073741823 2
1073741823 0
1073741823 2
1073741823 0
536870911 2
1073741823 2
1073741823 0
536870911 2
1073741823 1
1073741823 2
1073741823 0
1073741823 0
1073741823 0
1073741823 2
1073741823 2
1073741823 0
1073741823 2
1073741823 0
1073741823 0
1073741823 0
1073741823 2
107...

result:

ok 200000 numbers

Test #7:

score: 0
Accepted
time: 477ms
memory: 7772kb

input:

2000
50 50
301364921 49607558 56439403 72138223 738745954 181451970 38781406 471102148 4784830 822066927 452651281 90223924 953803789 734536065 187547996 210346218 345980284 176449147 902515665 381421430 951687051 393184831 343896411 352474642 377720626 788400840 998087699 244732858 836294423 773917...

output:

1073741823 0
1073741823 2
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
1073741823 0
536870911 2
1073741823 0
10...

result:

ok 200000 numbers

Test #8:

score: -100
Time Limit Exceeded

input:

1
100000 100000
412845353 687170600 219497096 548310424 820681466 491266412 904807220 701500031 955106649 72422395 93882988 690742484 618525007 878384372 612794801 559975151 691971081 470518678 75198195 606919949 495771077 94896835 955641205 829504564 891480929 134520717 93159022 75955235 203043484 ...

output:

1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1073741823 1
1...

result: