abc 354 D
将这道题转化为二维前缀和是比较方便的,加一个大的数,把点坐标变为正数
jls 用了算术右移和加法配合,刚好在坐标轴上实现了对不同位置出现次数的计算
只能说,实在是太精细的做法
算术右移对于负数和正数都向下取整,而加法用在正数上会向上取整
用在负数上,j 越大,对图像的映射越靠上,最后得到的正好是对应位置图形出现的次数
ans += 1LL * v[i][j] * ((n - j + 3) >> 2) * ((m - i + 1) >> 1);
这个似乎是某种方法,可以对于坐标中无论正负的平铺,得到与原点构成的矩阵出现的行次数和列次数
属于是分析明白了也只能记住结论的那种
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a, b, c, d;
int v[2][4] = {{2, 1, 0, 1}, {1, 2, 1, 0}};
ll get(int n, int m) {
ll ans = 0;
for (int i = 0; i < 2; i ++)
for (int j = 0; j < 4; j ++) {
ans += 1LL * v[i][j] * ((n - j + 3) >> 2) * ((m - i + 1) >> 1);
}
return ans;
}
int main()
{
cin >> a >> b >> c >> d;
ll ans = get(a, b) - get(a, d) - get(c, b) + get(c, d);
cout << ans << endl;
return 0;
}
abc 353 D
后缀和