排列组合史山能A!
查看原帖
排列组合史山能A!
398155
某kob在此楼主2024/9/10 20:15

第一次没把last放到for循环里面,只有16pts。避雷

#include<bits/stdc++.h>
using namespace std;

const long long MOD = 998244353;

int T, id, n, m, c, f;
long long h[1010][1010], sum[1010][1010];
char mp[1010][1010];
long long ansc, ansf;
/*
1 0
6 6 1 1
000010
011000
000110
010000
011000
000000
*/
int main(){
	cin >> T >> id;
	while (T --){
		ansc = ansf = 0;
		memset(h, 0, sizeof(h));
		memset(mp, 0, sizeof(mp));
		memset(sum, 0, sizeof(sum));
		cin >> n >> m >> c >> f;
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= m; j ++)
				cin >> mp[i][j];
		
		for (int i = 1; i <= n; i ++)
			for (int j = m; j >= 1; j --){
				if (mp[i][j] == '0')	h[i][j] = h[i][j + 1] + 1;
				else	h[i][j] = 0;
			}

		for (int j = 1; j <= m; j ++){
			for (int i = n; i >= 1; i --){
				if (h[i][j] >= 2)
					sum[i][j] = sum[i + 1][j] + h[i][j] - 1;
				else if (h[i][j] != 0)	sum[i][j] = sum[i + 1][j];
				else	sum[i][j] = 0;
			}
		}

		for (int j = 1; j <= m; j ++){
			for (int i = 1; i <= n; i ++){
				if (h[i][j] >= 2 && mp[i + 1][j] == '0' && mp[i + 2][j] == '0'){
					ansc += (h[i][j] - 1) * sum[i + 2][j] % MOD;
					ansc %= MOD;
				}
			}
		}
		
		memset(sum, 0, sizeof(sum));
		for (int j = 1; j <= m; j ++){
			int last = n;
			for (int i = n; i >= 1; i --){
				if (h[i][j] >= 2)
					sum[i][j] = sum[i + 1][j] + (h[i][j] - 1) * (last - i),
					sum[i][j] %= MOD;
				else if (h[i][j] != 0)	sum[i][j] = sum[i + 1][j];
				else	sum[i][j] = 0, last = i - 1;
			}
		}
//		
//		for (int i = 1; i <= n; i ++)
//		{
//			for (int j = 1; j <= m; j ++)
//				cout << sum[i][j] << " ";
//			cout << endl;
//		}
		
		for (int j = 1; j <= m; j ++){
			for (int i = 1; i <= n; i ++){
				if (h[i][j] >= 2 && mp[i + 1][j] == '0' && mp[i + 2][j] == '0'){
					ansf += (h[i][j] - 1) * sum[i + 2][j] % MOD;
					ansf %= MOD;
				}
			}
		}
		
		cout << ansc * c << " " << ansf * f << endl;
	}
	
	return 0;
} 
2024/9/10 20:15
加载中...