Prean @ 2020-03-26 16:15:13
#include<iostream>
unsigned long long ans,st[4460][15],a[20000005],s[20000005][15];
int n,m,q,p,t,l[4460],x[4460],y[4460],bl[20000005];
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);
}
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
using namespace GenHelper;
int a=rand_()&32767;
int b=rand_()&32767;
return a*32768+b;
}
inline unsigned long long ask(int L,int R)
{
if(L>R)return 0;int k=l[R-L+1];
return std::max(s[L][k],s[R+1-(1<<k)][k]);
}
inline unsigned long long Ask(int L,int R)
{
if(L>R)std::swap(L,R);unsigned long long ans=0;
if(bl[L]==bl[R])return ask(L,R);
int k=l[bl[R]-bl[L]+1],s=bl[L]*p,t=(bl[R]-1)*p+1;
ans=std::max(st[bl[L]+1][k],st[bl[R]-2-(1<<k)][k]);
ans=std::max(ans,ask(L,y[bl[L]]));
ans=std::max(ans,ask(x[bl[R]],R));
return ans;
}
main()
{
int i,j,k;std::cin>>n>>m>>q;srand(q);p=4480;
for(i=1;i<=n;++i)
{
a[i]=read();bl[i]=i/p+1;t=bl[n];
st[bl[i]][0]=std::max(st[bl[i]][0],a[i]);
}t=bl[n];for(i=1;i<=t;++i)x[i]=(i-1)*p,y[i]=x[i]+p-1;
x[1]=1;y[t]=n;for(i=1;i<=p;++i)l[i]=l[i-1]+((1<<l[i-1])==i);
for(j=1;(1<<j)<=t;++j)for(i=1;i+(1<<j)-1<=t;++i)
st[i][j]=std::max(st[i][j-1],st[i+(1<<j-1)][j-1]);
for(j=1;(1<<j)<=p;++j)for(i=1;i+(1<<j)-1<=n;++i)
s[i][j]=std::max(s[i][j-1],s[i+(1<<j-1)][j-1]);
while(m--)ans+=Ask(read()%n+1,read()%n+1);std::cout<<ans;
}
连本地都出了问题,还有优化空间的方法吗QAQ
by Prean @ 2020-03-26 16:41:26
就是为了O(1)求每一块的最值
by FZzzz @ 2020-03-26 16:44:13
@limaopipi2022 每一块不用 st 表啊,你要是每一块都建一个 st 表那还不如直接暴力 st 表
记一下块的前后缀最小值就行了
by Alex_Wei @ 2020-03-26 16:44:38
@limaopipi2022 块内不需要 ST 表。。。数据随机所以在同一块直接暴力查询就行了啊
by Prean @ 2020-03-26 16:49:03
我块内搞成暴力了。。。。。。
所以有了一个TLE的算法。。。
by arfa @ 2020-03-26 17:01:26
@limaopipi2022 看看最下面 https://www.luogu.com.cn/blog/acking/The-end-for-my-OI
by Prean @ 2020-03-26 18:08:11
@function_of_zero @Alex_Wei 谢谢,我现在80分了,在卡常
by Prean @ 2020-03-26 18:08:31
还有@arfa