TlE了一个点,求优化
查看原帖
TlE了一个点,求优化
670766
QWQ_SenLin楼主2022/11/26 21:22

代码:

//noip rp+++++;
#include <cstdio>
#define MOD (long long)(998244353)
using namespace std;

//chm_qwq orz and chm_qwq is dalao.

int T , id;
bool a[1005][1005];
int bb[1005][1005];
int cc[1005][1005];
int dd[1005][1005];

void init(int n , int m){
	for(int j = 1;j <= m;j++){
		int x = n;
		for(int i = n;i >= 1;i--){		
			if(a[i][j]){
				x = i - 1;
				continue;
			}
			bb[i][j] = x;
		}
	}
	for(int i = 1;i <= n;i++){
		int x = m;
		for(int j = m;j >= 1;j--){
			if(a[i][j]){
				x = j - 1;
				continue;
			}
			cc[i][j] = x;
		}
	}
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++)
			dd[i][j] = (cc[i][j] + dd[i - 1][j]) % MOD;
//	for(int i = 1;i <= n;i++){
//		for(int j = 1;j <= m;j++)
//			printf("%d " , cc[i][j]);
//		puts("");
//	}
}

int main(void){
	//freopen("plant.in" , "r" , stdin);
	//freopen("plant.out" , "w" , stdout);
	scanf("%d%d" , &T , &id);
	while(T--){
		int n , m , c , f;
		long long vc = 0 , vf = 0;
		scanf("%d%d%d%d" , &n , &m , &c , &f);
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= m;j++)
				scanf("%1d" , &a[i][j]);
//		if(id == 5 || id == 6){
//			puts("0 0");
//			continue;
//		}
		if(c == 0 && f == 0){
			puts("0 0");
			continue;
		}
		init(n , m);
		if(c > 0){
			if(n <= 500 && m <= 500){
				for(int x1 = 1;x1 <= n - 1;x1++){
					for(int y0 = 1;y0 <= m;y0++){
						if(a[x1][y0]) continue;
						long long sum = 0;
						long long qwq1 = cc[x1][y0] - y0;
						if(qwq1 == 0) continue;
						if(bb[x1][y0] - x1 < 2) continue;
						for(int x2 = x1 + 2;x2 <= n;x2++){
							if(a[x2][y0]) break;
							long long qwq2 = cc[x2][y0] - y0;						
							sum += qwq1 * qwq2 % MOD;
							sum %= MOD;
						}
						vc += sum % MOD;
						vc %= MOD;
					}
				}
			}
			else{
				for(int x1 = 1;x1 <= n - 1;x1++){
					for(int y0 = 1;y0 <= m;y0++){
						if(a[x1][y0]) continue;
						long long sum = 0;
						long long qwq1 = cc[x1][y0] - y0;
						if(qwq1 == 0) continue;
						if(bb[x1][y0] - x1 < 2) continue;
						long long x2 = bb[x1][y0];
						long long qwq2 = dd[x2][y0] - dd[x1 + 1][y0] - (x2 - x1 - 1) * y0;
						vc += qwq2 * qwq1 % MOD;
						vc %= MOD;
					}
				}
			}
		}
		if(f > 0){
			for(int x1 = 1;x1 <= n - 1;x1++){
				for(int y0 = 1;y0 <= m;y0++){
					if(a[x1][y0]) continue;
					long long sum = 0;
					long long qwq1 = cc[x1][y0] - y0; //y0
					if(qwq1 == 0) continue;
					if(bb[x1][y0] - x1 < 2) continue;
					for(int x2 = x1 + 2;x2 <= n && qwq1;x2++){
						if(a[x2][y0]) break;
						long long qwq2 = cc[x2][y0] - y0; //y1
						sum += (qwq1 * qwq2 % MOD) * (bb[x2][y0] - x2) % MOD;
						sum %= MOD;
					}
					vf += sum % MOD;
					vf %= MOD;
				}
			}
		}
		printf("%lld %lld\n" , vc , vf);
	}
	return 0;
}

最后一个点TLE了

2022/11/26 21:22
加载中...