QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#473709 | #6427. Just Another Game of Stones | RainingLove | TL | 2985ms | 34504kb | C++20 | 4.5kb | 2024-07-12 13:30:17 | 2024-07-12 13:30:18 |
Judging History
answer
#include <bits/stdc++.h>
#define log(x) (31^__builtin_clz(x))
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';
}
}
}
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3844kb
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: 2985ms
memory: 34504kb
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: 2965ms
memory: 34436kb
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...