QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#485306#6631. Maximum Bitwise ORucup-team1525#WA 165ms9992kbC++202.7kb2024-07-20 16:07:032024-07-20 16:07:04

Judging History

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

  • [2024-07-20 16:07:04]
  • 评测
  • 测评结果:WA
  • 用时:165ms
  • 内存:9992kb
  • [2024-07-20 16:07:03]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,q;
int a[N+5];
struct Que{
    int l,r,a,b;
}qu[N+5];
struct Ans{
    int val,c;
    Ans(int val=0,int c=0):val(val),c(c){}
}ans[N+5];
int bl[N+5][35];
int ss[N+5];
bool check(int x){
    while(x){
        if(!(x&1)) return 0;
        x>>=1;
    }
    return 1;
}
pair<int,int> get(int x){
    int a=-1,b=-1;
    for(int i=0;x>>i;i++)
        if(!(x>>i&1)){
            if(a==-1) a=i;
            b=i;
        }
    return make_pair(a,b);
}
int chk(int x,int l,int r){
    if(x==-1||x<(1<<l)) return 0;
    return x^(x-(1<<l));
}
void work1(){
    static int s[N+5];
    static int pre[N+5];
    fill(ans,ans+q+1,Ans());
    for(int i=1;i<=q;i++)
        memset(bl[i],-1,sizeof bl[i]);
    for(int i=0;i<30;i++){
        for(int j=1;j<=n;j++){
            s[j]=s[j-1]+(a[j]>>i&1);
            pre[j]=pre[j-1];
            if(a[j]>>i&1) pre[j]=a[j];
        }
        for(int j=1;j<=q;j++){
            auto [l,r,a,b]=qu[j];
            if(s[r]-s[l-1]>0){
                ans[j].val|=1<<i;
                if(s[r]-s[l-1]==1) bl[j][i]=pre[r];
            }
        }
    }
    for(int i=1;i<=q;i++){
        if(check(ans[i].val)){
            ans[i].c=0; qu[i].a=qu[i].b=-1;
        }
        else{
            map<int,int> use;
            ans[i].c=2;
            auto [aa,bb]=get(ans[i].val);
            qu[i].a=aa; qu[i].b=bb;
            int x=__lg(ans[i].val);
            ans[i].val|=(1<<x)-1;
            ss[i]=0;
            for(int j=0;j<aa;j++){
                int v=chk(bl[i][j],aa,bb);
                if(v>>bb) ss[i]++;
            }
            for(int j=bb+1;j<30;j++){
                int v=chk(bl[i][j],aa,bb);
                if((v>>bb)&&!(v>>j)){
                    if(!use[bl[i][j]]){
                        use[bl[i][j]]=1; ss[i]++;
                    }
                }
            }
            // printf("%d\n",ss[i]);
        }
    }
}
void work2(){
    static int s[N+5];
    for(int aa=0;aa<30;aa++)
        for(int bb=aa;bb<30;bb++){
            for(int i=1;i<=n;i++){
                int v=chk(a[i],aa,bb);
                s[i]=s[i-1]+((v>>bb)>0);
            }
            for(int i=1;i<=q;i++){
                auto [l,r,a,b]=qu[i];
                if(a==aa&&b==bb&&s[r]-s[l-1]>ss[i])
                    ans[i].c=1;
            }
        }
}
void solve(){
    scanf("%d %d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=q;i++)
        scanf("%d %d",&qu[i].l,&qu[i].r);
    work1();
    work2();
    for(int i=1;i<=q;i++)
        printf("%d %d\n",ans[i].val,ans[i].c);
}
int main(){
    int t; scanf("%d",&t);
    while(t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 165ms
memory: 7924kb

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: 154ms
memory: 9992kb

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: -100
Wrong Answer
time: 148ms
memory: 8224kb

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:

wrong answer 5770th numbers differ - expected: '1', found: '2'