ABC260 作战总结
ABC260 作战总结
今后开始写一些模拟赛外的其他比赛的总结(也许有题解?)。
开场点到另一场去了,耽误了点时间,切完前四题发现已经过了分钟了,看来自己读题+写题的速度还有待提高。
想了一段时间,然后发现可以差分然后尺取法,然后就切了
做的时候老师来说了两句话,稍微分了下心,再加上没有认真观察数据范围,导致思路不是很明朗,不过一会就想到了,花了
然而写的时候都把字母打错,导致之后做和了。。然后开摆,最终排名
赛后发现的做法没遇见过。下面简要写了的题解。
G - Scalene Triangle Area
官方题解:https://atcoder.jp/contests/abc260/editorial/4466
我们考虑每一个石子对答案产生的贡献,大概长这样
11111110 11111000 11100000 10000000 00000000
每行都做一个差分,就变成了
+......- +....-.. +..-.... +-...... ........
考虑把这个东西处理出来,发现复杂度依然很庞大,但我们处理这个东西可以再差分
对于+
+....... ........ ........ ........ -.......
对于-
.......- ........ ........ ........ +.......
这样,每个石子就可以做了
然后做次前缀和就行了
代码ヽ( ̄▽ ̄)ノ
#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]); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具