暴力解法——考试时我不会也能拿60分
查看原帖
暴力解法——考试时我不会也能拿60分
305735
Jean_Gunnhildr楼主2024/7/20 21:25

我不会线段树,不会ST表,不会高精度怎么办?(注:本篇不是题解,只是一些应试技巧,代码只有60分)

  • step1 不放弃

  • step2 观察数据量,如果我要存a b 两个数组,还要存二维数组c的话,1e5的点反正要TLE,只开4000 * 4000即可,再开long long

不开long long见祖宗

  • step3 小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小

=>假设小L选了一行,小Q肯定会选这一行里最大的=>枚举c数组l1~r1行,打擂出每行l2~r2列最小值,这些最小值中的最大值即可

  • step4 按照暴力的思路写出代码,结果太大,又不会高精度,只能用__int128(有没有大佬解答一下,为什么c数组不会炸,maxmin从c取出来的,用long long就0分,用__int128就60分)
#include<bits/stdc++.h>
using namespace std;

long n,m,q,a[4001],b[4001];
long long c[4001][4001];/*大小约122MB,虽然后面会RE,但1~12点能拿分*/

inline void write(__int128 x){
    if(x/10) write(x/10);
    putchar((x%10)^48);
    return ;/*快写,__int128不能用常规输入输出*/
}


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++){
		for(int j=1;j<=m;j++){
			c[i][j]=a[i]*b[j];
		}
	}//十分朴素
	while(q--){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		__int128 maxmin;
		bool used=false;
		for(int i=l1;i<=r1;i++){
			__int128 minn;
			bool usedt=false;
			for(int j=l2;j<=r2;j++){
				if(!usedt){
					minn=c[i][j];
					usedt=true;/*不赋初值是因为我也不知道c里面最小有多小,那么就避开初值问题*/
				}
				else if(c[i][j]<minn){
					minn=c[i][j];
				}
			}
			if(!used){
				maxmin=minn;
				used=true;
			}/*同样我也不知道c里面最大多大,那就不赋初值*/
			else if(minn>maxmin){
				maxmin=minn;
			}

		}
		if(maxmin==0) cout<<0;
		else{
            if(maxmin<0){
                cout<<'-';//负数特判一下
                maxmin*=-1;
            }
            write(maxmin);
		}
		cout<<endl;
	}
	return 0;
}

同志们

暴力出奇迹,打表出省一

2024/7/20 21:25
加载中...