拿特殊性质12的分,40pts,超时怎么改?
查看原帖
拿特殊性质12的分,40pts,超时怎么改?
381510
yljx楼主2022/11/5 15:28
#include <bits/stdc++.h>
using namespace std;
long long int n,m,q,sum[100010][3];
long long int l1,l2,r1,r2;
long long int ans[100010];
struct p{
	long long int i,c;
}a[100010],b[100010];
bool bmp(p st1,p st2){
	return st1.i<st2.i;
}
bool cmp(p st1,p st2){
	return st1.c<st2.c;
}
int main(){
    cin>>n>>m>>q;
    for(long long int i=1;i<=n;i++){
    	cin>>a[i].c;a[i].i=i;
    	if(!a[i].c)sum[i][1]=sum[i-1][1]+1;
    	else sum[i][1]=sum[i-1][1];
	} 
//    sort(a+1,a+n+1);
    for(long long int i=1;i<=m;i++){
    	cin>>b[i].c;b[i].i=i;
    	if(!b[i].c)sum[i][2]=sum[i-1][2]+1;
    	else sum[i][2]=sum[i-1][2];    	
	} 
//    sort(b+1,b+m+1);
    for(long long int i=1;i<=q;i++){
    	sort(a+1,a+n+1,bmp); sort(b+1,b+m+1,bmp);
        cin>>l1>>r1>>l2>>r2;
        long long int flag1=sum[r1][1]-sum[l1-1][1],flag2=sum[r2][2]-sum[l2-1][2];
        sort(a+l1,a+r1+1,cmp); sort(b+l2,b+r2+1,cmp);
        if(l1==r1){
        	if(flag1)ans[i]=0;
			else{//b: -3 -2 -1 0 1 2
				if(a[l1].c<0){
					ans[i]=a[l1].c*b[r2].c;
				}else{
					if(!flag2&&b[l2].c>0)ans[i]=a[r1].c*b[l2].c;
					else ans[i]=a[l1].c*b[l2].c;
				}
			}
		}else{
			if(l2==r2){
        		if(flag2)ans[i]=0;
				else{//b: -3 -2 -1 0 1 2
					if(b[l2].c<0)ans[i]=a[l1].c*b[l2].c;
					else ans[i]=a[r1].c*b[l2].c;
				}
			}
			if(a[l1].c>0&&b[l2].c>0){//1
				ans[i]=a[r1].c*b[l2].c;	
			}
		}				
    }
    for(long long int i=1;i<=q;i++)cout<<ans[i]<<endl;
    return 0;
}

2022/11/5 15:28
加载中...