EVERYTHING HAPPENS FOR THE BEST|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-16 13:27阅读: 26评论: 0推荐: 0

abc260_g Scalene Triangle Area 题解

Scalene Triangle Area

题意

给定一个大小为 n×n 的字符矩阵,每个字符为 X 或者 O

对于一个位于 (x,y) 的字符 o 和一个格子 (u,v),如果满足以下条件,那么 (u,v) 就可以被 (x,y) 控制。

  • xunyvn
  • (ux)+vy2<m

给定 m 和询问数 Q,每次询问给定 uv,求有多少个格子可以控制 (u,v)

思路

分为两种做法。

0x00

推一推式子,可以发现:

  • x 行第 (y2×m)y 列的 O 都可以控制 (x,y)
  • x1 行第 (y2×(m1))y 列的 O 都可以控制 (x,y)
  • 以此类推。
  • xm+1 行第 y1 列与第 y 列的 O 可以控制 (x,y)
  • 1(xm) 行没有可以控制 (x,y) 的格子。

做法就出来了,对于每次询问在线求答案即可。

还有一个小问题,枚举每一行和每一列求答案是 O(n2) 的,但每一行对答案有贡献的部分是一个区间,可以用前缀和优化,总时间复杂度为 O(n2+Q×n)并不是最优解法,但可以过此题。

#include <iostream>
using namespace std;
int n, m, q, x, y, sum[2010][2010];
char c;
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> c;
sum[i][j] = sum[i][j - 1] + (c == 'O'); // n 行的前缀和
}
}
for (cin >> q; q; q--) {
cin >> x >> y;
int cnt = 0;
for (int i = 0; i < m && x - i; i++) { // 枚举每一行,如果超出矩阵范围就退出循环
cnt += sum[x - i][y] - sum[x - i][max(0, y - 2 * (m - i))]; // 前缀和
}
cout << cnt << '\n';
}
return 0;
}

0x01

二维差分。

对于一个位于 (x,y)O,可以控制的范围如上,其他的自己推一下(

先对于每一行列差分一下,变成下图:

观察上图,可以发现:第一列可以轻松的用行差分优化,但后面的 1 怎么办呢?

我们要引入一个差分思想:一个不行就两个!

把这个差分矩阵拆成两个,在最后还原时将两个矩阵加起来。

左边矩阵差分点只有两个,可以 O(1) 处理差分,可右边怎么办呢?

仔细观察一下,欸,1 的位置有规律!

将右边矩阵优化成下图:

差分矩阵通过前缀和思想还原原矩阵,上图每次只要加上 (x1,y+2) 的值就可以了,还原原矩阵时需要将两个差分矩阵加起来,再对它进行列前缀和即可,时间复杂度 O(n2+Q)

具体实现看代码。

#include <iostream>
using namespace std;
int n, m, q, x, y, sum[2010][2010], num[2010][12010][2]; // 注意数组的大小
char c;
int main () {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> c;
if (c == 'O') {
num[i][j][0]++, num[min(n + 1, i + m)][j][0]--; // 左边矩阵
num[i][j + 2 * m][1]--, num[min(n + 1, i + m)][j][1]++; // 右边矩阵
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n + 2 * m; j++) {
num[i][j][1] += num[i - 1][j + 2][1]; // 左右矩阵各自进行还原
num[i][j][0] += num[i - 1][j][0];
if (j <= n) {
sum[i][j] = sum[i][j - 1] + num[i][j][1] + num[i][j][0]; // 最终的矩阵还原
}
}
}
for (cin >> q; q; q--) {
cin >> x >> y;
cout << sum[x][y] << '\n';
}
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17405355.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(26)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 - 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 一殇/白祺/苏少安/苏栗无/公子无央/白刃昏鸦/非欢/清茗/未及昭声/汀帆/赵艹地

作曲 : 沐若

心机之蛙,一直摸你肚子

——《名侦探柯南》原创同人曲

策划:炊饭

作曲:沐若

作词:一殇、白祺、苏少安、苏栗无、公子无央、白刃昏鸦、非欢、清茗、未及昭声、汀帆、赵艹地

编曲:斓音音乐实验室

演唱:叶辞樱、温海、寒砧、南柯、小茜玛姬、墨催、阿崔Ac、贝壳初、千湛、兮茶子、乔慕、黎鹿北、起千温卿、遮阳伞、曲悠

后期:幽谷

题字/美工:徒夫

监制:楠烛

【角色-词作-歌手】

【铃木园子-一殇-叶辞樱】

没有绝对杀机

爱恨调转 对错是唯一

【赤井秀一-白祺-温海】

枪膛里银色子弹

最后的致命一击

-

【毛利小五郎-苏少安-寒砧】

沉睡倒看真相 别小瞧绅士

叼烟来探 糊涂作势

【妃英理-白祺-南柯】

剥离出实情

透过谎言再续 不败传奇

-

【苏栗无-樱/砧/海/柯】

迷茫中看见吗 向谁的真谛

让谁的眼泪 都变成迷离

罪的答案是你 路的尽头是你

-

【怪盗基德-公子无央-小茜玛姬】

Kaitou 这雪白的谜语 将帽檐压低

以滑翔翼敬礼 向手铐和你

【服部平次-白刃昏鸦-墨催】

爱与真相是唯一

十字路口 迷宫的暗语

-

【灰原哀-非欢-乔慕】

回到少年时期 退化至逃离

像天才的过去 深海的鲨鱼

【毛利兰-非欢-起千温卿】

害怕妖怪和雷雨

正义和你 是我的勇气

-

【清茗-姬/催/慕/卿/悠】

天才与罪犯在探试 我已锁定案件起始

黑暗中蛰伏无休止 被贪欲吞噬

黄昏时 布谷钟请柬送至

跋涉深渊之池 侦探们的镇魂诗

-

【目暮十三-一殇-阿崔Ac】

樱花之名起誓

追寻真相 对罪恶通缉

【阿笠博士-苏少安-贝壳初】

古怪是科学正义

热衷将永不歇止

-

【安室透-白刃昏鸦-千湛】

被隐去的名姓 真伪皆归零

谜面重启 逆向独行

【琴酒-未及昭声-兮茶子】

用死亡美学 虔诚将你献祭

无声狙击

-

【汀帆-崔/初/湛/茶】

拨开重重迷题 信仰即期许

平扫僵阵地 守一方境域

且看如何踏破 早已残废终局

-

【江户川柯南-未及昭声-黎鹿北】

真相 折射在那镜片 透视在眼底

借时间逆行 拆穿真凶伏笔

【工藤新一-公子无央-遮阳伞】

骄傲是天才之理

逐一剖析 黑色的缝隙

-

【赵艹地-鹿/伞】

转动命运齿轮 去超越世纪

继续探查疑案 来解开谜题

【贝尔摩德-赵艹地-曲悠】

最喜爱伪装神秘

卷入迷雾 从容扣动扳机

-终-

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示