P11234 求卡常(1.8s卡进1s)
查看原帖
P11234 求卡常(1.8s卡进1s)
413905
Nicolas192837楼主2024/11/26 21:10

题目链接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;
}
2024/11/26 21:10
加载中...