求助
查看原帖
求助
358971
朦胧_XY楼主2022/11/26 22:05

12pts

大样例过了,目前发出来的样例也过了,代码交上去的时候行末的回车也删了,不知道有什么错求助QwQ。。

(顺带提一句大样例是官方的吗,输出震惊到我了。)

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 1005;
const ll Mod = 998244353;
int T, n, m, C, F, a[N][N];
ll sum1[N][N], sum2[N][N], w[N][N], ansC, ansF;
vector<int> vec[N];
int main(){
	//freopen("test4.out", "w", stdout);
	int tmp, id, p;
	scanf("%d%d", &T, &id);
	while(T--){
		memset(w, 0, sizeof(w));
		memset(sum1, 0, sizeof(sum1));
		memset(sum2, 0, sizeof(sum2));
		scanf("%d%d%d%d", &n, &m, &C, &F);
		getchar(); ansC = ansF = 0;
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= m; j++){
				a[i][j] = getchar() ^ 48;
				if(a[i][j]) vec[j].push_back(i);
			}
			getchar(); w[i][m + 1] = -1;
			for(int j = m; j; j--){
				if(a[i][j]) w[i][j] = -1;
				else w[i][j] = w[i][j + 1] + 1;
			}
		}
		for(int i = 1; i <= m; i++){
			tmp = n + 1, vec[i].push_back(tmp);
			for(int j = n; j; j--){
				sum1[j][i] = sum1[j + 1][i] + w[j][i];
				if(a[j][i]) tmp = j;
				if(j < n) sum2[j][i] = (sum2[j + 1][i] + w[j][i] * (tmp - j - 1)) % Mod;
			}
		}
		for(int i = 1; i <= m; i++){
			tmp = vec[i][0], p = 0;
			for(int j = 1; j <= n; j++){
				if(j > tmp) tmp = vec[i][++p];
				if(a[j][i] || j + 2 >= tmp) continue;
				ansC += w[j][i] * (sum1[j + 2][i] - sum1[tmp][i]), ansC %= Mod;
				if(j + 2 < n) ansF += w[j][i] * (sum2[j + 2][i] - sum2[tmp][i]), ansF %= Mod;
				//printf("%d %d %lld %lld\n", i, j, tmp, sum2[j + 2][i]);
			}
		}
		for(int i = 1; i <= m; i++)
			vec[i].clear();
		printf("%lld %lld\n", C * ansC % Mod, F * ansF % Mod);
	}
	return 0;
}
/*大样例3:
输入:
1 0
16 12 1 1
000000000001
011111111111
000000000011
011111111111
010011111111
010111100011
010011101111
011111100011
111111111111
000011111111
011111111111
000000111111
011111000111
011111011111
011111000111
011111011111

输出:
114 514
*/
2022/11/26 22:05
加载中...