不会用随机数生成器……
查看原帖
不会用随机数生成器……
538427
czy0323楼主2022/9/15 00:03

我的四毛子正确性已经验证过了,交了st表模板题是AC的,但是连样例都过不去,我怀疑是随机数生成器的问题,有没有大佬解答一下?

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const ll MAXN=7e6+5,MAXNLOG=25,INF=0;
ll n,m,s,len,cntpiece;
unsigned long long ans;
ll a[MAXN];
ll front[MAXN],tail[MAXN];
ll st[MAXN][MAXNLOG];

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;
}

inline int read(){
    using namespace GenHelper;
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}

inline void init(){
	ll cnt=0,Max=-INF;
	for(ll i=1;i<=n;i++){
		if( cnt==len ){
			st[++cntpiece][0]=Max;
			cnt=0,Max=-INF;
		}
		Max=max(Max,a[i]);
		front[i]=Max;
		cnt++;
	}
	st[++cntpiece][0]=Max;
	cnt=0,Max=-INF;
	for(ll i=1;i<=cntpiece;i++){
		ll one=min(n,i*len),Max=-INF;
		for(ll j=one;j>=i*len-len+1;j--){
			Max=max(Max,a[j]);
			tail[j]=Max;
		}
	}
	for(ll j=1; (1<<j)<=cntpiece; j++)
		for(ll i=1; i+(1<<j)-1<=cntpiece; i++)
			st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}

int main(){
	scanf("%lld%lld%lld",&n,&m,&s);
	srand(s);
	len=log2(n)+rand()%3;
	for(ll i=1;i<=n;i++)
		a[i]=read();
	init();
	for(ll i=1;i<=m;i++){
		ll l=read()%n+1,r=read()%n+1,Max=-INF;
		if( l>r )
			continue;
		ll lpiece=ceil(l*1.0/len),rpiece=ceil(r*1.0/len);
		if( lpiece==rpiece ){
			for(ll j=l;j<=r;j++)
				Max=max(Max,a[j]);
			ans+=Max;
			continue;
		}
		lpiece++,rpiece--;
		if( lpiece<=rpiece ){
			ll k=log2(rpiece-lpiece+1);
			Max=max(st[lpiece][k],st[rpiece-(1<<k)+1][k]);
		}
		ans+=max(max(tail[l],front[r]),Max);
	}
	printf("%lld",ans);
}
2022/9/15 00:03
加载中...