当前位置: 首页 > wzjs >正文

php网站广告管理系统360推广

php网站广告管理系统,360推广,电脑版qq,厦门网站建设企业题目传送门 前言 最近几场可以切 A~E 了,所以赛时没切掉 F。而且最最令人开心的是只 WA 了一个点的快感,可惜 Atcoder 不给部分分。 小细节 代码中可能出现的错误就放这里了,作者是用的数组和 vector,所以对使用 map 的家人们…

题目传送门

前言

最近几场可以切 A~E 了,所以赛时没切掉 F。而且最最令人开心的是只 WA 了一个点的快感,可惜 Atcoder 不给部分分。

小细节

代码中可能出现的错误就放这里了,作者是用的数组和 vector,所以对使用 map 的家人们可能帮助不大。下文无特殊说明默认通过了样例(如果没过且思路正确可以留言让我帮你调):

  • 样例 RE 了。
    • 可能是数组下标访问到负数了,需要在进行统计时初始值赋值为 H × W H \times W H×W,因为如果整个矩形都是您定义为 − 1 -1 1 的那个字符,就会炸掉。
    • 可能是数组开小了,请分析您数组访问时是否越界。
    • 还有可能是其他某些地方您写错了,导致 RE,包括其他地方的数组访问。
  • WA × 4 \times\ 4 × 4,可能是您存储需要还原的下标没有存 H × W H \times W H×W,您可能觉得之后反正都要将其赋值为 1 1 1,没有必要,但是别忘了这题有多测,下一次访问时不一定还是这个位置。
  • WA × 2 \times\ 2 × 2,可能是您存储需要还原的下标有问题,比如一开始加进容器的是 H H H 而不是 H × W H \times W H×W
  • WA × 1 \times\ 1 × 1,可能是您跟我一样在最后将统计数组清空时是用 int k = v.size() - 1,然后进行操作再 pop_back(),再将变量的值减一,并且判的是 while (k),那么改成 while (k + 1) 即可。

如果都没有问题,那么只有您自己调试了。

解题思路

由于题目要求选出一个矩形,使得里面包含 . 的数量等于 # 的数量,所以我们可以将 . 视为 1 1 1# 视为 − 1 -1 1,问题就转化为了求内部所有元素之和为 0 0 0 的矩形数量。

求解的话需要枚举矩形左上角和右下角再进行求和,于是一个 O ( H 3 W 3 ) \mathcal{O}(H^3W^3) O(H3W3) 的超朴素算法就出来了。再使用前缀和优化一下可以做到 O ( H 2 W 3 ) \mathcal{O}(H^2W^3) O(H2W3)

但是注意到数据范围 H W ≤ 3 × 10 5 HW \leq 3 \times 10^5 HW3×105,显然 T 到下辈子,因此可以分讨一下。

  • H ≤ W H \leq W HW,那我们可以预处理每一行的前缀和,枚举的时候只需要枚举 H H H,相较于枚举 W W W 减少了一点时间复杂度,为 O ( H 3 W 2 ) \mathcal{O}(H^3W^2) O(H3W2)
  • H > W H > W H>W,那我们可以预处理每一列的前缀和,同理,时间复杂度为 O ( H 2 W 3 ) \mathcal{O}(H^2W^3) O(H2W3)

看这样子应该不可以优化了,但是给我们提供了一种思路,如果可以做到 O ( H W × min ⁡ ( H , W ) ) O(HW \times \min(H,W)) O(HW×min(H,W)) 的话是可以通过的。先考虑 H = 1 , W = 3 × 10 5 H = 1, W = 3\times 10^5 H=1,W=3×105 的情况,复杂度为 O ( H 2 W ) \mathcal{O}(H^2W) O(H2W),显然不会超时,只有当 H = 3 × 10 5 , W = 3 × 10 5 H = \sqrt{3\times 10^5}, W = \sqrt{3\times 10^5} H=3×105 ,W=3×105 才会变成 O ( n n ) \mathcal{O}(n \sqrt{n}) O(nn ) 的时间复杂度( n = 3 × 10 5 n = 3\times 10^5 n=3×105),但是也不会超时,因此我们有了一个大概的方向。

这里才是这道题目最不容易想到的地方吧。注意我说的是“吧”。我们还是跟上面一样进行分讨。

  • H ≤ W H \leq W HW,那么我们就枚举 u , d u, d u,d 表示矩形的第一行位于网格的第 u u u 行,最后一行位于网格的第 d d d 行。然后前缀和出每一列中 u ∼ d u\sim d ud 行的和。

    接着就到了重点,首先我们知道对于前缀和数组 s u m sum sum,想要算第 l l l 项到第 r r r 项的和,只需要计算 s u m r − s u m l − 1 sum_r - sum_{l - 1} sumrsuml1 即可,那么我们只需要保证 s u m r − s u m l − 1 = 0 sum_r - sum_{l - 1} = 0 sumrsuml1=0 就能满足题意(即第 u u u 行到第 d d d 行中第 l l l 列到第 r r r 列的和为 0 0 0),移项可得 s u m r = s u m l − 1 sum_r = sum_{l - 1} sumr=suml1,由于我们不关心 l − 1 l - 1 l1 的值是多少,因此只需要前面存在 s u m k = s u m r sum_k = sum_r sumk=sumr 即可,因此我们只需要再枚举一个 j j j,表示第 j j j 列,如果 r e s res res 出现过,就将答案增加出现次数个 1 1 1,再 r e s → r e s + s u m j res \to res + sum_j resres+sumj,注意第一次出现 r e s = 0 res = 0 res=0 时你的答案没有增加,所以需要特殊处理。

  • H > W H > W H>W,同理,是需要将上一种情况的行变成列,列变成行即可。

最坏时间复杂度约为 O ( H W H W ) \mathcal{O}(HW\sqrt{HW}) O(HWHW )。别忘了多测要清空还有 r e s res res 可能为负数导致数组越界哦。

都看这么久了,别忘了三连哦!

CODE:

#include <bits/stdc++.h>
using namespace std;
#define int long long
string s[300010];
int sum[300010], cnt[600010];
vector<int> v;
signed main() {ios::sync_with_stdio(false);ios_base::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T;cin >> T;while (T--) {int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> s[i];s[i] = " " + s[i];}int ans = 0;if (n <= m) {for (int u = 1; u <= n; u++) {for (int j = 1; j <= m; j++) {sum[j] = 0;}for (int d = u; d <= n; d++) {for (int j = 1; j <= m; j++) {sum[j] += (s[d][j] == '.' ? 1 : -1);}cnt[n * m] = 1;v.push_back(n * m);int res = n * m;for (int j = 1; j <= m; j++) {res += sum[j];if (cnt[res]) {ans += cnt[res];}cnt[res]++;v.push_back(res);}for (int u : v) {cnt[u] = 0;}v.clear();}}} else {for (int l = 1; l <= m; l++) {for (int i = 1; i <= n; i++) {sum[i] = 0;}for (int r = l; r <= m; r++) {for (int i = 1; i <= n; i++) {sum[i] += (s[i][r] == '.' ? 1 : -1);}cnt[n * m] = 1;v.push_back(n * m);int res = n * m;for (int i = 1; i <= n; i++) {res += sum[i];if (cnt[res]) {ans += cnt[res];}cnt[res]++;v.push_back(res);}for (int u : v) {cnt[u] = 0;}v.clear();}}}cout << ans << "\n";}return 0;
}
http://www.dtcms.com/wzjs/33.html

相关文章:

  • 武汉网站模板搭建线上推广软件
  • 惠州有哪些做网站的公司nba在线直播免费观看直播
  • 韩都衣舍网站建设方案seo网站优化网站编辑招聘
  • 广州做网站需要多少钱百度网站如何优化排名
  • 怎么用div做网站最新热点新闻
  • 营口做网站价格优化
  • 贵阳做网站公司排名百度地图3d实景地图
  • 外贸建站哪家强外贸网站怎么做做企业推广
  • 开发公司组织架构图南宁seo网络优化公司
  • 有哪些做任务网站网络营销到底是干嘛的
  • 邯郸做网站推广的地方最新天气预报最新消息
  • 深圳建立企业网站西安seo外包平台
  • 工厂做网站有用吗杭州seo代理公司
  • 网站开发 动易谷歌seo是什么
  • 高端网站建设的小知识seo案例分享
  • 学校网站建设的背景域名查询站长之家
  • js获取网站域名建站软件可以不通过网络建设吗
  • 淘宝做任务网站seo视频教程百度云
  • 销售运营主要做什么seo产品优化推广
  • 网站开发工程师优势百度搜索一下就知道
  • 网站建设上线问题网络软文营销的案例
  • wordpress系统管理密码忘记西安seo代理
  • 广州市工程交易中心官网平台seo
  • 域名网站建设流程本周的新闻大事10条
  • 西藏城乡住房建设厅网站赣州seo优化
  • 免费的开源网站引擎搜索技巧
  • 高端网站建设好处大数据精准营销系统
  • 网站开发 教学目标熊猫seo实战培训
  • 个人网站主页建设教程公众号开发