求卡常
查看原帖
求卡常
242524
JRzyh楼主2020/11/29 12:10

刚学分块,求助

#\
p\
r\
a\
g\
m\
a\
 \
G\
C\
C\
 \
t\
a\
r\
g\
e\
t\
(\
"\
a\
v\
x\
,\
s\
s\
e\
2\
,\
s\
s\
e\
3\
,\
s\
s\
e\
4\
,\
m\
m\
x\
"\
)
#include<bits/stdc++.h>
using namespace std;
namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
using namespace GenHelper;
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
inline int read()
{
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}
unsigned long long out;
int size,num,n,m,s,a[20000008],block[4480],l[4480],r[4480],belong[20000008],be[4480][4480],la[4480][4480],st[4480][15];
inline int query(int l,int r)
{
	if(r<l)return -114514;
	int k=log2(r-l+1);
	return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	srand(s);
	for(register int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	size=sqrt(n);
	num=n/size+(n%size!=0);
	l[1]=1;
	r[1]=size;
	for(register int i=2;i<=num;i++)
	{
		l[i]=r[i-1]+1;
		r[i]=min(l[i]+size-1,n);
	}
	for(register int i=1;i<=num;i++)
	{
		for(register int j=l[i];j<=r[i];j++)
		{
			block[i]=max(block[i],a[j]);
			belong[j]=i;
		}
		for(register int j=l[i];j<=r[i];j++)
		{
			be[i][j-l[i]+1]=max(be[i][j-l[i]],a[j]);
		}
		for(register int j=r[i];j>=l[i];j--)
		{
			la[i][r[i]-j+1]=max(la[i][r[i]-j],a[j]);
		}
	}
	for(register int i=1;i<=num;i++)
	{
		st[i][0]=block[i];
	}
	for(register int j=1;j<=log2(num);j++)
	{
		for(register int i=1;i+(1<<j)-1<=num;i++)
		{
			st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
		}
	}
	while(m--)
	{
		int x=read()%n+1,y=read()%n+1,l1=min(x,y),r1=max(x,y),ans=0;
		if(belong[l1]==belong[r1])
		{
			for(int i=l1;i<=r1;i++)
			{
				ans=max(a[i],ans);
			}
			out+=ans;
			continue;
		}
		ans=max(ans,la[belong[l1]][r[belong[l1]]-l1+1]);
		ans=max(ans,be[belong[r1]][r1-l[belong[r1]]+1]);
		ans=max(ans,query(belong[l1]+1,belong[r1]-1));
		out+=ans;
	}
	printf("%llu",out);
	return 0;
}
2020/11/29 12:10
加载中...