CF1648A Weird Sum 解题报告
CF1648A. Weird Sum
给出两个整数
n,m ,和一个n \times m 的矩阵。若该矩阵中两元素相同,sum 就加上它们所在位置的曼哈顿距离。求sum 的值。
1 \leq n \le m, n \cdot m \leq 100000
思路
首先给出曼哈顿距离的定义式:
是两个绝对值的加和,而题目中所让我们求的同种颜色的两两之间曼哈顿距离,可以表示为如下式:
显然,我们可以把
首先,我们可以把
显然,这个式子里的
对每种颜色做一遍上面的计算,总时间复杂度为
代码
const int N = 1e5 + 10;
int n,m;
vector <int> c1[N],c2[N];
void solve() {
for (int i = 1;i <= 100000;++i) c1[i].clear(),c2[i].clear();
read(n,m);
for (int i = 0;i < n;++i) {
for (int j = 0;j < m;++j) {
int col;read(col);
c1[col].push_back(i);
c2[col].push_back(j);
}
}
int ans = 0;
for (int i = 1;i <= 100000;++i) {
if (c1[i].empty()) continue;
sort(c1[i].begin(),c1[i].end());
int pre = 0;
for (int j = 0;j < c1[i].size();++j) {
ans += j * c1[i][j] - pre;
pre += c1[i][j];
}
}
for (int i = 1;i <= 100000;++i) {
if (c2[i].empty()) continue;
sort(c2[i].begin(),c2[i].end());
int pre = 0;
for (int j = 0;j < c2[i].size();++j) {
ans += j * c2[i][j] - pre;
pre += c2[i][j];
}
}
printf("%lld\n",ans);
}
signed main() {
solve();
return 0;
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭