题目链接P11234
先不管题目特有的卡常,问问有没有大佬能找一下代码本身可以优化的地方
目前最慢的点是大约1.8s
#include<iostream>
#include<vector>
#include<bitset>
using namespace std;
inline int read()
{
int x=0;
short f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
{
f=-f;
}
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x << 3)+(x << 1)+c-'0';
c=getchar();
}
return x*f;
}
inline void wit(long long x)
{
if(x!=0)
{
wit(x/10);
putchar(x%10+'0');
}
return ;
}
inline void write(long long x,bool edl)
{
if(x<=0)
{
if(x==0)
{
putchar('0');
}else{
putchar('-');
wit(x*(-1));
}
}else{
wit(x);
}
if(edl)
{
putchar('\n');
}else{
putchar(' ');
}
return ;
}
void test(bool ext)
{
puts("TEST");
if(ext)
{
exit(0);
}
return ;
}
const int N=2e5+5;
int n,m,abas[N]={0},a[N],c[N],k=0,n1=1,dp1[25][N],dp3[25][N],up2[N];
bitset<N>d[25];
long long ans,cf[N]={0},val[N]={0};
vector<int>rec[N];
void build(char tur,int pos)
{
int pos1=pos+(1 << (tur-1));
if(tur==0)
{
dp1[tur][pos]=a[pos];
dp3[tur][pos]=pos;
return ;
}
build(tur-1,pos);
build(tur-1,pos1);
if(d[tur][pos]&&dp1[tur-1][pos1]>=tur||!d[tur][pos]&&dp1[tur-1][pos]<tur)
{
dp1[tur][pos]=dp1[tur-1][pos1];
}else{
dp1[tur][pos]=dp1[tur-1][pos];
}
if(!d[tur][pos]&&dp1[tur-1][pos]>=tur)
{
dp3[tur][pos]=dp3[tur-1][pos];
}else{
dp3[tur][pos]=dp3[tur-1][pos1];
}
return ;
}
inline void build2(char tur,int pos,int edg,char req)
{
int l,r,pos1=pos+(1 << (tur-1));
char req1=max(req,tur);
if(tur==0)
{
l=(1 << (up2[pos]-1))+1;
if(pos==1)
{
l=1;
}
if(req<=a[pos])
{
r=edg;
}else{
r=min(edg,pos-1);
}
// write(pos,false);
// write(l,false);
// write(r,true);
if(l>r)
{
return ;
}
cf[l]+=pos;
cf[r+1]-=pos;
return ;
}
// write(tur,false);
// write(pos,false);
// write(dp3[tur][pos],true);
if(!d[tur][pos])
{
if(dp1[tur-1][pos]>=tur)
{
build2(tur-1,pos,edg,req1);
build2(tur-1,pos1,min(edg,dp3[tur-1][pos]-1),req);
}else{
build2(tur-1,pos,min(edg,dp3[tur-1][pos]-1),req1);
build2(tur-1,pos1,edg,req);
}
}else{
if(dp1[tur-1][pos1]>=tur)
{
build2(tur-1,pos,min(edg,dp3[tur-1][pos1]-1),req);
build2(tur-1,pos1,edg,req1);
}else{
build2(tur-1,pos,edg,req);
build2(tur-1,pos1,min(edg,dp3[tur-1][pos1]-1),req1);
}
}
return ;
}
int main()
{
int x[4],t;
char ch;
long long ans1;
n=read();
m=read();
for(int i=1;i<=n;i++)
{
abas[i]=read();
}
for(int i=1;i<=m;i++)
{
c[i]=read();
rec[c[i]].push_back(i);
}
for(int i=1;i<=n;i++)
{
if(n1<i)
{
n1=(n1 << 1);
k++;
}
up2[i]=k;
}
for(int i=n+1;1;i++)
{
if(n1<i)
{
break;
}
up2[i]=k;
}
for(int i=1;i<=k;i++)
{
for(int j=1;j<=(1 << (k-i));j++)
{
ch=0;
while(ch!='0'&&ch!='1')
{
ch=getchar();
}
d[i][1+((j-1) << i)]=ch-'0';
}
}
t=read();
for(int t1=1;t1<=t;t1++)
{
for(int i=0;i<=3;i++)
{
x[i]=read();
}
for(int i=1;i<=n1;i++)
{
a[i]=abas[i] ^ x[i & 3];
// write(a[i],false);
}
// puts("");
build(k,1);
ans=0;
n1=1;
for(int i=0;i<=k;i++)
{
for(int j=1;j<=n1;j++)
{
val[j]=0;
cf[j]=0;
}
build2(i,1,n1,0);
for(int j=1;j<=n1;j++)
{
val[j]=val[j-1]+cf[j];
}
for(int p=(n1 >> 1)+1;p<=n1;p++)
{
for(int j=0;j<rec[p].size();j++)
{
ans=ans^(val[p]*rec[p][j]);
// write(val[p],false);
}
}
n1 = (n1 << 1);
}
n1 = (n1 >> 1);
// puts("");
write(ans,true);
}
return 0;
}