QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#473716#6427. Just Another Game of StonesRainingLoveTL 2991ms34504kbC++204.4kb2024-07-12 13:33:322024-07-12 13:33:33

Judging History

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

  • [2024-07-12 13:33:33]
  • 评测
  • 测评结果:TL
  • 用时:2991ms
  • 内存:34504kb
  • [2024-07-12 13:33:32]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,q,a[maxn],op,l,r,x;

inline int read() {
    int x=0,f=1;
    char ch=cin.get();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=cin.get();}
    while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=cin.get();}
    return x*f;
}

const int maxm=500+5;
int bel[maxn],st[maxm],ed[maxm];
int Max[maxm];
vector<int>qwq[maxm],Xor[maxm],sum[30][maxm];
int qp[30];
int main() {

    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    n=read(),q=read();
    for(int i=1;i<=n;++i) a[i]=read();
    qp[0]=1;
    for(int i=1;i<=29;++i) qp[i]=(qp[i-1]<<1);
    int block=sqrt(n);
    for(int i=1;i<=(n-1)/block+1;++i) {
        st[i]=(i-1)*block+1;
        ed[i]=min(i*block,n);
        for(int j=st[i];j<=ed[i];++j) {
            bel[j]=i;
            qwq[i].push_back(a[j]);
            Xor[i].push_back(0);
            for(int k=0;k<=29;++k) sum[k][i].push_back(0);
        }
        sort(qwq[i].begin(),qwq[i].end());
        for(int j=0;j<qwq[i].size();++j) {
            if(j==0) {
                Xor[i][j]=qwq[i][j];
                for(int k=0;k<=29;++k) sum[k][i][j]=((qwq[i][j]&qp[k])!=0);
            }
            else {
                Xor[i][j]=(Xor[i][j-1]^qwq[i][j]);
                for(int k=0;k<=29;++k) sum[k][i][j]=((qwq[i][j]&qp[k])!=0)+sum[k][i][j-1];
            }
        }
    }
    while(q--) {
        op=read(),l=read(),r=read(),x=read();
        if(op==1) {
            int s=bel[l]+1,t=bel[r]-1;
            for(int i=s;i<=t;++i) Max[i]=max(Max[i],x);
            for(int i=st[s-1];i<=ed[s-1];++i) {
                a[i]=max(a[i],Max[s-1]);
                if(l<=i&&i<=r) a[i]=max(a[i],x);
                qwq[s-1][i-st[s-1]]=a[i];
            }
            Max[s-1]=0;
            sort(qwq[s-1].begin(),qwq[s-1].end());
            for(int i=0;i<qwq[s-1].size();++i) {
                if(i==0) {
                    Xor[s-1][i]=qwq[s-1][i];
                    for(int k=0;k<=29;++k) sum[k][s-1][i]=((qwq[s-1][i]&qp[k])!=0);
                }
                else {
                    Xor[s-1][i]=(Xor[s-1][i-1]^qwq[s-1][i]);
                    for(int k=0;k<=29;++k) sum[k][s-1][i]=((qwq[s-1][i]&qp[k])!=0)+sum[k][s-1][i-1];
                }
            }
            if(bel[l]!=bel[r]) {
                for(int i=st[t+1];i<=ed[t+1];++i) {
                    a[i]=max(a[i],Max[t+1]);
                    if(l<=i&&i<=r) a[i]=max(a[i],x);
                    qwq[t+1][i-st[t+1]]=a[i];
                }
                Max[t+1]=0;
                sort(qwq[t+1].begin(),qwq[t+1].end());
                for(int i=0;i<qwq[t+1].size();++i) {
                    if(i==0) {
                        Xor[t+1][i]=qwq[t+1][i];
                        for(int k=0;k<=29;++k) sum[k][t+1][i]=((qwq[t+1][i]&qp[k])!=0);
                    }
                    else {
                        Xor[t+1][i]=(Xor[t+1][i-1]^qwq[t+1][i]);
                        for(int k=0;k<=29;++k) sum[k][t+1][i]=((qwq[t+1][i]&qp[k])!=0)+sum[k][t+1][i-1];
                    }
                }
            }
        }
        else {
            int s=bel[l]+1,t=bel[r]-1;
            int tmp=0;
            for(int i=s;i<=t;++i) {
                int p=upper_bound(qwq[i].begin(),qwq[i].end(),Max[i])-qwq[i].begin();
                int len=qwq[i].size();
                tmp^=(Xor[i][len-1]^Xor[i][p-1]);
                if(p&1) tmp^=Max[i];
            }
            for(int i=l;i<=min(r,ed[s-1]);++i) tmp^=max(a[i],Max[s-1]);
            if(bel[l]!=bel[r]) {
                for(int i=st[t+1];i<=r;++i) tmp^=max(a[i],Max[t+1]);
            }
            tmp^=x;
            if(tmp==0) cout<<"0\n";
            else {
                int js=-1;
                int ans=0;
                if((tmp^x)<x) ans++;
                while(tmp) js++,tmp>>=1;
                for(int i=l;i<=min(r,ed[s-1]);++i) if((max(a[i],Max[s-1])&(1<<js))) ans++;
                if(bel[l]!=bel[r]) {
                    for(int i=st[t+1];i<=r;++i) if((max(a[i],Max[t+1])&(1<<js))) ans++;
                }
                for(int i=s;i<=t;++i) {
                    int p=upper_bound(qwq[i].begin(),qwq[i].end(),Max[i])-qwq[i].begin();
                    int len=qwq[i].size();
                    if((Max[i]&(1<<js))) ans+=p;
                    ans+=sum[js][i][len-1]-sum[js][i][p-1];
                }
                cout<<ans<<'\n';
            }
        }
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3764kb

input:

5 4
1 2 1 4 1
2 1 3 1
1 2 4 3
2 2 4 4
2 1 4 4

output:

1
0
3

result:

ok 3 number(s): "1 0 3"

Test #2:

score: 0
Accepted
time: 2991ms
memory: 34440kb

input:

200000 200000
962352030 173642520 1008864183 74920228 684681800 500911321 1001441054 257633652 185843534 59168654 317689197 731348417 123888883 708119712 340055368 876566011 980078202 969174443 814012870 715639041 596932238 173757742 314504576 1045746913 740811577 570187156 999816627 12441059 122507...

output:

38889
57353
46659
19709
34617
138247
1211
755
16087
26119
14051
12263
33399
14363
41869
21117
97277
16733
64611
737
32715
25031
148859
17395
76263
56261
19825
93349
48429
22291
31645
9833
35195
95623
184389
39321
153
6067
6495
25369
9041
35785
39783
111237
151543
54289
121169
165785
101803
101821
15...

result:

ok 99837 numbers

Test #3:

score: 0
Accepted
time: 2983ms
memory: 34504kb

input:

200000 200000
962448218 958513200 826817273 288493295 72329606 793844396 161474258 749557053 862074728 135184207 668911451 838765519 576454286 121274388 388348135 263187992 907050448 15832750 818487193 381586607 465699121 602151844 79762183 196026513 582482566 931149307 480935730 159461747 585046007...

output:

18515
12719
24057
31925
17901
115925
146271
104061
8999
158211
146057
111579
31549
925
50509
62041
43485
3087
109093
6501
70803
59687
75457
137021
61153
24695
112325
3009
42565
14461
8419
2077
61229
60333
160819
40045
65745
4959
2349
13803
73683
115339
137585
48641
23943
1473
84973
68993
89153
5491
...

result:

ok 99962 numbers

Test #4:

score: -100
Time Limit Exceeded

input:

200000 200000
962544405 669642056 644770364 502066363 533719237 13035646 395249287 167738631 464564098 211199761 1020133705 946182622 1029019688 608170888 436640902 723551797 834022694 136232881 822961515 47534172 334466005 1030545946 918761614 420047937 424153555 218369633 1035796657 306482436 1047...

output:

3255
81127
56879
67249
46421
116905
6071
4199
79925
17027
86579
891
62153
89905
97233
63251
10311
629
59525
142181
170519
3593
30971
86945
30873
81313
84145
3727
115629
1579
38801
6967
84659
134727
79203
108359
19231
116677
99273
12449
6909
189769
46489
77353
34309
13175
43589
124695
21251
35733
130...

result: