赛时AC的代码为何在洛谷上t了第13个点?
查看原帖
赛时AC的代码为何在洛谷上t了第13个点?
597004
IRIDESCENTqwq楼主2023/12/4 21:01

rt

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, q; char p[1010][1010];
int s[1010][1010];
int f[1010], g[1010];
int count(int row, int l, int r){
	return s[row][r] - ((l-1>=0)?s[row][l-1]:0);
}
int calc(int row, int l, int r){
	int z = r / n - l / n - 1; 
	int ans = 0;
	ans += max(z, 0ll) * s[row][n - 1];
	if (z < 0){
		ans += count(row, l % n, r % n);
	}
	else{
		ans += count(row, l % n, n - 1);
		ans += count(row, 0, r % n);
	}
	return ans;
}
int count2(int l, int r){
	return g[r] - ((l-1>=0) ?g[l-1]:0);
}
signed main(){
	cin >> n >> q;
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			cin >> p[i][j];
			if (j == 0){
				s[i][j] = (int)(p[i][j] == 'B');
			}
			else{
				s[i][j] = s[i][j - 1] + (int)(p[i][j] == 'B');
			}
		}
	}
	for (int o = 1; o <= q; o++){
		int a, b, c, d;
		cin >> a >> b >> c >> d;
		for (int i = 0; i < n; i++){
			f[i] = calc(i, b, d);
			if (i == 0) g[i] = f[i];
			else g[i] = g[i - 1] + f[i];
		}
		int z = c / n - a / n - 1;
		int ans = 0;
		ans += max(z, 0ll) * g[n - 1];
		if (z < 0){
			ans += count2(a % n, c % n);
		} 
		else{
			ans += count2(a % n, n - 1);
			ans += count2(0, c % n);
		}
		cout << ans << endl;
	}
	return 0;
} 
2023/12/4 21:01
加载中...