灵异事件
  • 板块灌水区
  • 楼主yezerui11
  • 当前回复13
  • 已保存回复13
  • 发布时间2023/8/17 15:59
  • 上次更新2023/11/3 03:07:55
查看原帖
灵异事件
305904
yezerui11楼主2023/8/17 15:59
#include<bits/stdc++.h>
using namespace std;
#define ll __int128
const ll inf=1e18+10;
ll c[16][2]={
	{1,0},//0000
	{1,0},//0001
	{1,0},//0010
	{1,0},//0011
	{0,1},//0100
	{3,2},//0101
	{2,1},//0110
	{2,1},//0111
	{0,1},//1000
	{1,3},//1001
	{0,1},//1010
	{1,3},//1011
	{0,1},//1100
	{3,2},//1101
	{0,1},//1110
};
int n,m,q;
struct tree{
	__int128 l,r,sum,mx[2],mn[2],f;
	//mx[0]最大的负数 mx[1]最大的正数 
	//mn[0]最小的负数 mn[1]最小的正数 
	//f 是否有0 
}p[400010][2];
void push_up(ll x,ll k){
	p[x][k].mx[0]=max(p[x<<1|1][k].mx[0],p[x<<1][k].mx[0]);
	p[x][k].mx[1]=max(p[x<<1|1][k].mx[1],p[x<<1][k].mx[1]);
	p[x][k].mn[0]=min(p[x<<1|1][k].mn[0],p[x<<1][k].mn[0]);
	p[x][k].mn[1]=min(p[x<<1|1][k].mn[1],p[x<<1][k].mn[1]),
	p[x][k].f=p[x<<1|1][k].f|p[x<<1][k].f;
}
ll read(){
    string a;
    cin>>a;
    ll k=0;
    int len=a.size();
    for(int i=0;i<len;i++){
        k=k*10+a[i]-'0';
    }
    return k;
}
void build(ll x,ll l,ll r,ll k){
	p[x][k].l=l;
	p[x][k].r=r;
	if(l==r){
	    p[x][k].sum=read();
	    cout<<"(";
		
		if(p[x][k].sum==0){
			p[x][k].f=1;
		}
		if(p[x][k].sum>0){
			p[x][k].mx[1]=p[x][k].mn[1]=p[x][k].sum;
		}
		if(p[x][k].sum<0){
			p[x][k].mx[0]=p[x][k].mn[0]=p[x][k].sum;
		}
//		cout<<x<<' '<<p[x][k].mn[0]<<' '<<p[x][k].mx[0]<<' '<<p[x][k].mn[1]<<' '<<p[x][k].mx[1]<<endl;
		return;
	}
	ll mid=(l+r)>>1;
	build(x<<1,l,mid,k);
	build(x<<1|1,mid+1,r,k);
	push_up(x,k);
//	cout<<x<<' '<<p[x][k].mn[0]<<' '<<p[x][k].mx[0]<<' '<<p[x][k].mn[1]<<' '<<p[x][k].mx[1]<<endl;
}

ll query(ll x,ll l,ll r,ll k,ll t){
//	cout<<p[x][k].l<<' '<<p[x][k].r<<endl;
	if(p[x][k].r<l||p[x][k].l>r){
		if(t==4){
			return 0;
		}else if(t<=1){
			return inf;
		}else{
			return -inf;
		}
	}
//	cout<<'*';
	if(p[x][k].l>=l&&p[x][k].r<=r){
		if(t==4){
			return p[x][k].f;
		}else if(t<=1){
			return p[x][k].mn[t];
		}else{
			return p[x][k].mx[t%2];
		}
	}  
	if(t==4){
		ll k=query(x<<1,l,r,k,t);
		if(k){
			return 1;
		}
		return query(x<<1|1,l,r,k,t);
	}else if(t<=1){
		return min(query(x<<1,l,r,k,t),query(x<<1|1,l,r,k,t));
	}else{
		return max(query(x<<1,l,r,k,t),query(x<<1|1,l,r,k,t));
	}
}
int main(){
    n=read();m=read();q=read();
	for(int i=1;i<=400000;i++){
		p[i][0].mx[0]=-inf;
		p[i][0].mn[1]=inf;
		p[i][0].mx[1]=p[i][0].mn[0]=0;
		
		p[i][1].mx[0]=-inf;
		p[i][1].mn[1]=inf;
		p[i][1].mx[1]=p[i][1].mn[0]=0;
	}
	build(1,1,n,0);
	build(1,1,m,1);
	while(q--){
	   // cout<<"^%$&%$";
		long long l1=read(),r1=read(),l2=read(),r2=read();
// 		cin>>l1>>r1>>l2>>r2;//
// 		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		ll x[5]={0};
		ll y[5]={0};
		x[0]=query(1,l1,r1,0,0);
		x[1]=query(1,l1,r1,0,2);
		x[2]=query(1,l1,r1,0,1);
		x[3]=query(1,l1,r1,0,3);
		x[4]=query(1,l1,r1,0,4);
		
		y[0]=query(1,l2,r2,1,0);
		y[1]=query(1,l2,r2,1,2);
		y[2]=query(1,l2,r2,1,1);
		y[3]=query(1,l2,r2,1,3);
		y[4]=query(1,l2,r2,1,4);
		int f1=0,f2=0,f3=0,f4=0;
		long long ans=0;
		if(x[0]<0){
			f1=1;
		}
		if(x[3]>0){
			f2=1;
		}
		if(y[0]<0){
			f3=1;
		}
		if(y[3]>0){
			f4=1;
		}
		ll base=(f1<<3)+(f2<<2)+(f3<<1)+f4;
		if(base==15){
			ans=max(x[1]*y[3],x[2]*y[0]);
		}else{
			ans=x[c[base][0]]*y[c[base][1]];
		}
		if(x[4]){
			ans=max(ans,0LL);
		}
		if(y[4]){
			ans=min(ans,0LL);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

rt,我在调这题时一直过不去,如果把51行的cout删掉就没法输出样例一第二行的"4",这是怎么回事?怎样改正?

2023/8/17 15:59
加载中...