ABC260 作战总结

ABC260 作战总结

今后开始写一些模拟赛外的其他比赛的总结(也许有题解?)。

开场点到另一场ARC去了,耽误了点时间,切完前四题发现已经过了37分钟了,看来自己读题+写题的速度还有待提高。

E想了一段时间,然后发现可以差分然后尺取法,然后就切了

F的时候老师来说了两句话,稍微分了下心,再加上没有认真观察数据范围,导致思路不是很明朗,不过一会就想到了,花了20min

然而写E,F的时候都把字母打错,导致之后18minGEX了。。然后开摆,最终排名247

赛后发现G的做法没遇见过。下面简要写了G的题解。

G - Scalene Triangle Area

官方题解:https://atcoder.jp/contests/abc260/editorial/4466

我们考虑每一个石子对答案产生的贡献,大概长这样

11111110
11111000
11100000
10000000
00000000

每行都做一个差分,就变成了

+......-
+....-..
+..-....
+-......
........

考虑把这个东西处理出来,发现复杂度依然很庞大,但我们处理这个东西可以再差分

对于+

+.......
........
........
........
-.......

对于-

.......-
........
........
........
+.......

这样,每个石子就可以O(1)做了

然后做3次前缀和就行了

代码ヽ( ̄▽ ̄)ノ
#include <cstdio>
#include <iostream>
#define RE register
#define LL long long
using namespace std;
inline void read(int &x) {
x = 0; int f = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
if(f) x = ~x + 1;
}
int n, m;
char s[2020][2020];
int vert[2020][10010], diag[2020][10010], res[2020][10010], q, x, y;
int main() {
read(n), read(m);
for(int i = 1; i <= n; ++i)
scanf("%s",s[i] + 1);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
if(s[i][j] == 'O') {
++vert[i][j], --diag[i][j + 2 * m];
if(i + m <= n) --vert[i + m][j], ++diag[i + m][j];
}
for(RE int i = 1; i <= n; ++i)
for(RE int j = 1; j <= 10000; ++j)
vert[i][j] += vert[i - 1][j], diag[i][j] += diag[i - 1][j + 2];
for(RE int i = 1; i <= n; ++i)
for(RE int j = 1; j <= 10000; ++j)
res[i][j] = vert[i][j] + diag[i][j];
for(RE int i = 1; i <= n; ++i)
for(RE int j = 1; j <= 10000; ++j)
res[i][j] += res[i][j - 1];
read(q);
while(q--) {
read(x), read(y);
printf("%d\n",res[x][y]);
}
}
posted @   DCH233  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示