vector<pii>为什么要开4s?
  • 板块学术版
  • 楼主Satrpx
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/30 14:49
  • 上次更新2023/10/27 04:52:15
查看原帖
vector<pii>为什么要开4s?
240021
Satrpx楼主2022/10/30 14:49
#include<bits/stdc++.h>

#define x first
#define y second
#define pf push_front
#define pb push_back

#define rep(i,a,b) for(int i=a;i<(int)(b);i++)
#define r0p(i,n) rep(i,0,n)
#define r1p(i,n) rep(i,1,n+1)
#define all(a) a.begin(),a.end()
#define dbg(a) cerr<<#a<<": "<<a<<endl
#define sz(a) (int)(a.size())
#define re(a) cout<<a<<endl,exit(0)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const int intmx=0x3f3f3f3f;
const ll llmx=1e18;

template <typename T> inline T abs(T a){return a<0?-a:a;}

void IO(string s=""){
	if(!sz(s)) return;
	freopen((s+".in").c_str(),"r",stdin);
	freopen((s+".out").c_str(),"w",stdout);
}

bool stt;

#define N 100005

int n,m,t;
ll a[N],b[N];
const int S=sqrt(N)+1;

struct P60_{
	ll ans[N],mn[S];
	vector<pair<pii,int> >q[N];//考试时此处开vector若不开O2要等4s。浪费我20min。求解为什么!
	void solve(){
		for(int e=0,l1,r1,l2,r2;e<t;e++){
			scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
			rep(i,l1,r1+1){
				q[i].push_back({{l2,r2},e});
			}
			ans[e]=LLONG_MIN;
		}
		if(m<=200&&n<=200){
			r1p(i,n){
				for(auto j:q[i]){
					ll res=LLONG_MAX;
					rep(k,j.x.x,j.x.y+1){
//						dbg(i);
//						dbg(k);
//						dbg(a[i]);
//						dbg(b[k]);
						res=min(res,a[i]*b[k]);
					}
					ans[j.y]=max(ans[j.y],res);
				}
			}
		}
		else{
			r1p(i,n){
				r0p(j,S) mn[j]=LLONG_MAX;
				r1p(j,m) mn[j/S]=min(mn[j/S],a[i]*b[j]);
				for(auto j:q[i]){
					ll res=LLONG_MAX;
					if(j.x.x/S==j.x.y/S){
						rep(k,j.x.x,j.x.y+1) res=min(res,a[i]*b[k]);
					}
					else{
						for(int k=j.x.x;k<(j.x.x/S+1)*S;k++) res=min(res,a[i]*b[k]);
						for(int k=j.x.x/S+1;k<j.x.y/S;k++) res=min(res,mn[k]);
						for(int k=j.x.y/S*S;k<=j.x.y;k++) res=min(res,a[i]*b[k]);
					}
					ans[j.y]=max(ans[j.y],res);
				}
			}
		}
		r0p(e,t) printf("%lld\n",ans[e]);
		exit(0);
	}
}P60;

bool edd;

signed main(){
	//cerr<<(&edd-&stt)/1024.0/1024.0<<endl;
//	IO("game");
	scanf("%d%d%d",&n,&m,&t);
	r1p(i,n) scanf("%lld",&a[i]);
	r1p(i,m) scanf("%lld",&b[i]);
//	if(n<=1000&&m<=1000)
		P60.solve();
	exit(0);
}
2022/10/30 14:49
加载中...