关于25--->100
  • 板块学术版
  • 楼主Iwara_qwq
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/11/8 09:09
  • 上次更新2023/10/27 03:49:40
查看原帖
关于25--->100
724676
Iwara_qwq楼主2022/11/8 09:09

RT
一个在infoj上25pts的假算法ccf给我100
tg B game
code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=3e5+5,inf=LONG_LONG_MAX;
ll n,m,q;
ll a[MAXN],b[MAXN];
ll max_a1[MAXN][25],min_a1[MAXN][25],max_b1[MAXN][25],min_b1[MAXN][25];
ll max_a2[MAXN][25],min_a2[MAXN][25],max_b2[MAXN][25],min_b2[MAXN][25];
ll sum_a[MAXN];
ll l1,r1,l2,r2;
ll get_max_a1(ll l,ll r){
	ll len=r-l+1;
	ll ans=-inf;
	while(len){
		ans=max(ans,max_a1[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
ll get_min_a1(ll l,ll r){
	ll len=r-l+1;
	ll ans=inf;
	while(len){
		ans=min(ans,min_a1[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
ll get_max_b1(ll l,ll r){
	ll len=r-l+1;
	ll ans=-inf;
	while(len){
		ans=max(ans,max_b1[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
ll get_min_b1(ll l,ll r){
	ll len=r-l+1;
	ll ans=inf;
	while(len){
		ans=min(ans,min_b1[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}

ll get_max_a2(ll l,ll r){
	ll len=r-l+1;
	ll ans=-inf;
	while(len){
		ans=max(ans,max_a2[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
ll get_min_a2(ll l,ll r){
	ll len=r-l+1;
	ll ans=inf;
	while(len){
		ans=min(ans,min_a2[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
ll get_max_b2(ll l,ll r){
	ll len=r-l+1;
	ll ans=-inf;
	while(len){
		ans=max(ans,max_b2[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
ll get_min_b2(ll l,ll r){
	ll len=r-l+1;
	ll ans=inf;
	while(len){
		ans=min(ans,min_b2[l][(ll)log2(len)]);
		l+=1ll<<(ll)log2(len);
		len=len-(1ll<<(ll)log2(len));
	}
	return ans;
}
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)cin>>b[i];
	for(int i=1;i<=n;i++)max_a1[i][0]=max(a[i],0ll),min_a1[i][0]=(a[i]<=0?inf:a[i]),sum_a[i]=sum_a[i-1]+(a[i]==0);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			max_a1[i][j]=max(max_a1[i][j-1],max_a1[min(i+(1ll<<(j-1)),n)][j-1]);
			min_a1[i][j]=min(min_a1[i][j-1],min_a1[min(i+(1ll<<(j-1)),n)][j-1]);
		}
	}
	for(int i=1;i<=m;i++)max_b1[i][0]=max(b[i],0ll),min_b1[i][0]=(b[i]<=0?inf:b[i]);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=m;i++){
			max_b1[i][j]=max(max_b1[i][j-1],max_b1[min(i+(1ll<<(j-1)),m)][j-1]);
			min_b1[i][j]=min(min_b1[i][j-1],min_b1[min(i+(1ll<<(j-1)),m)][j-1]);
		}
	}

	for(int i=1;i<=n;i++)max_a2[i][0]=(a[i]>=0?-inf:a[i]),min_a2[i][0]=(a[i]>=0?inf:a[i]);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			max_a2[i][j]=max(max_a2[i][j-1],max_a2[min(i+(1ll<<(j-1)),n)][j-1]);
			min_a2[i][j]=min(min_a2[i][j-1],min_a2[min(i+(1ll<<(j-1)),n)][j-1]);
		}
	}
	for(int i=1;i<=m;i++)max_b2[i][0]=(b[i]>=0?-inf:b[i]),min_b2[i][0]=(b[i]>=0?inf:b[i]);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=m;i++){
			max_b2[i][j]=max(max_b2[i][j-1],max_b2[min(i+(1ll<<(j-1)),m)][j-1]);
			min_b2[i][j]=min(min_b2[i][j-1],min_b2[min(i+(1ll<<(j-1)),m)][j-1]);
		}
	}
	// for(int i=1;i<=m;i++){
	// 	for(int j=0;j<=3;j++){
	// 		cout<<min_b1[i][j]<<" ";
	// 	}
	// 	cout<<endl;
	// }
	// cout<<"------------"<<endl;
	for(int i=1;i<=q;i++){
		cin>>l1>>r1>>l2>>r2;
		ll MAXA1=get_max_a1(l1,r1),MINA1=get_min_a1(l1,r1),MAXB1=get_max_b1(l2,r2),MINB1=get_min_b1(l2,r2);
		ll MAXA2=get_max_a2(l1,r1),MINA2=get_min_a2(l1,r1),MAXB2=get_max_b2(l2,r2),MINB2=get_min_b2(l2,r2);
		// cout<<MAXA1<<" "<<MINA1<<" "<<MAXB1<<" "<<MINB1<<endl;
		// cout<<MAXA2<<" "<<MINA2<<" "<<MAXB2<<" "<<MINB2<<endl;
		ll ans=-inf;
		if(MAXA1>0){//A有正数
			if(MINB2<0)ans=max(ans,MINA1*MINB2);
			else if(MAXB1>0)ans=max(ans,MAXA1*MINB1);
			else ans=max(ans,0ll);
		}
		if(MINA2<0){//A有负数
			if(MAXB1>0)ans=max(ans,MAXA2*MAXB1);
			else if(MINB2<0)ans=max(ans,MINA2*MAXB2);
			else ans=max(ans,0ll);
		}
		if(sum_a[r1]-sum_a[l1-1])ans=max(ans,0ll);
		cout<<ans<<endl;
	}
	return 0;
}

这很难卡吗?几个0不就卡掉了

2022/11/8 09:09
加载中...