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 Smile_Cindy @ 2020-03-26 16:20:53
@limaopipi2022 笛卡尔树了解一下?
by Warriors_Cat @ 2020-03-26 16:21:09
现分块再 ST表,普通的肯定过不去啊
by xhQYm @ 2020-03-26 16:22:17
这个卡空间的。
by xhQYm @ 2020-03-26 16:22:42
一个普通ST表过去了就不是黑题了((
by FZzzz @ 2020-03-26 16:24:32
我寻思lz这不是分了块吗,还是我眼瞎?
by UnyieldingTrilobite @ 2020-03-26 16:26:36
说句实话这题我是zkw线段树+面向数据编程,顺嘴吐槽一下居然有两个数据点一模一样
by Prean @ 2020-03-26 16:35:08
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];
说没分块的看清楚,s是第二个维度是每个分块是st,st是分了块之后的st
by Prean @ 2020-03-26 16:35:47
@Alpha 我不会。。。马上去学
by FZzzz @ 2020-03-26 16:38:50
@limaopipi2022 这题分块也可以吧,不过你那个 s
数组是干嘛的?
by Prean @ 2020-03-26 16:40:57
@function_of_zero s数组我不刚解释了嘛
好吧刚才打快了没说清楚。
s
是每一块的st