E. OpenStreetMap

题意: 给定一个 n∗mn*mn∗m 的棋盘,棋盘中每一个格子都有一个数字。现在再给出一个 a∗ba*ba∗b 的窗口,用这个窗口去覆盖棋盘中的区域,每一次覆盖的区域不相同,每一次覆盖区域中的最小值累加到答案中,最后输出答案。(1≤n,m≤3000,1≤a≤n,1≤b≤m)(1\leq n,m\leq 3000, 1\leq a\leq n,1\leq b\leq m)(1≤n,m≤3000,1≤a≤n,1≤b≤m)

思路: 当拿到这题之后,马上出现的思路就是如何查询区域最小值…然后立刻想到了二维RMQ和二维线段树,然后开始了网络搜索板子的过程…历时半小时之后,确认空间开不下,除非动态开点的二维线段树可能可以卡过去…然后认定此题为难题…进入放弃阶段。顺便看着这题通过人数达到300,开始感叹CF人均实力越来越强…

不得不说,我真是过于愚蠢。下面开始思路讲解?

首先,解决区域最小值的通用方法就是二维RMQ和二维线段树,但是这两者的空间会达到 n∗m∗16n*m*16n∗m∗16 ,因此大多数情况下均不适用。但是考察二维最值的题目却层出不穷,主要原因在于每道题都对题目进行了限制,从一开始的任意区域查询最值、任意区域修改,限制成了不修改、固定区域大小或者固定区域某一点等操作。

如此题,将任意区域的最小值,限制成了固定窗口大小的区域最小值,既然是固定窗口大小,那必然能考虑到预处理。

本题关键突破点在于长度固定,长度固定,长度固定!长度固定的最小值,最应该想到的就是单调队列!对于固定窗口的某一行求出该行区间长度为 aaa 的最小值,再用求出的最小值对于每一列长度为 bbb 的区间求取最小值即可得到区域 a∗ba*ba∗b 的最小值,由此此题结束。

反思:

  1. 今后的CF比赛务必摒弃网络搜索板子的过程,不要丢失少的可怜的思考时间。
  2. 比赛结束后,通过人数为200左右的题目,难度仅为 2100-2300;通过人数为100以内的题目,难度为2500+。
  3. 在比赛还剩 50min50min50min ~ 比赛结束的这一段时间中,后几道题的通过人数会翻倍!
  4. 一道题目,可能是一个难的题目进行了条件限制,也可能是为了考察某个算法进行的包装。一定要充分利用题目的条件限制,思考为什么要这样限制,如果不这样限制或者换一种限制方式会发生什么,毕竟这些限制条件才是题目关键突破点。
  5. 固定长度的区间最值,是单调队列的核心标签!!!

代码:

#include <bits/stdc++.h>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 3000+10;
const int M = 1e5+100;
const db EPS = 1e-9;
using namespace std;int n,m,a,b;
ll g0,x,y,z,mp[N][N],c1[N][N],g[N*N],q[N],head,tail,ans;void solve1(int row){head = 1, tail = 0;rep(i,1,m){while(tail >= head && mp[row][i] <= mp[row][q[tail]]) tail--;while(tail >= head && i-q[head] > b-1) head++;q[++tail] = i, c1[row][i] = mp[row][q[head]];}
}void solve2(int col){head = 1, tail = 0;rep(i,1,n){while(tail >= head && c1[i][col] <= c1[q[tail]][col]) tail--;while(tail >= head && i-q[head] > a-1) head++;q[++tail] = i, mp[i][col] = c1[q[head]][col];}
}int main()
{scanf("%d%d%d%d",&n,&m,&a,&b);scanf("%lld%lld%lld%lld",&g0,&x,&y,&z);g[0] = g0;rep(i,1,(n-1)*m+m-1) g[i] = ((ll)g[i-1]*(ll)x+(ll)y)%(ll)z;rep(i,1,n)rep(j,1,m){int xp = (i-1)*m+j-1;mp[i][j] = g[xp];}rep(i,1,n) solve1(i);rep(i,1,m) solve2(i);rep(i,1,n)rep(j,1,m){if(i >= a && j >= b) ans += mp[i][j];}printf("%lld\n",ans);return 0;
}

Codeforces Round #574 (Div. 2)相关推荐

  1. Codeforces Round #574 (Div. 2) D2. Submarine in the Rybinsk Sea (hard edition)

    题目链接:http://codeforces.com/contest/1195/problem/D2 解题心得:其实就是一个算贡献,只需要看每个数字放在不同位置能为最后的答案提供多少数值就行了,复杂度 ...

  2. Codeforces Round #574 (Div. 2) F. Geometers Anonymous Club (闵可夫斯基求和)

    题目链接:http://codeforces.com/contest/1195/problem/F 题意:现在有nnn个凸包,标号分别为1−n1-n1−n给出所有的顶点坐标,有qqq次询问,每次询问给 ...

  3. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  4. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  5. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  6. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  7. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  8. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  9. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  10. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

最新文章

  1. UIViewAnimationOptions类型与modalTransitionStyle模态样式
  2. vue父组件传值给字组件
  3. mysql配置读写分离无效_MySQL数据库的同步配置+MySql 读写分离
  4. 743. 网络延迟时间
  5. 第八节:数据库层次的锁机制详解和事务隔离级别
  6. java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟
  7. 三维网格精简算法java版_几种常见算法的精简版-
  8. 通过阿里OSS文件服务返回的URL获取文件流下载
  9. 45. 正确区分count、find、binary_search、lower_bound、upper_bound和equal_range
  10. .net excel循环插数据_[PaperReading]MEMC-Net 运动估计和运动补偿网络
  11. 小学生python游戏编程7----角色精灵定义
  12. Axure统计图表设计(Excel设计统计图表、HighChart设计统计图表)
  13. 王者战力查询教程,每天可查,数据准确~
  14. word无法自动修复计算机怎么办,电脑Word问题解决办法
  15. 将参数量化为二进制补码定点数的形式
  16. 图片无缝拼接 html,snapseed如何无缝拼接图片
  17. http请求digest auth认证
  18. 在ASP.NET开发中一些单词的标准缩写
  19. heif heic 的区别_什么是HEIF(或HEIC)图像格式?
  20. 计算机学术英语演讲,学术英语写作与演讲

热门文章

  1. Median of Two Sorted Array leetcode java
  2. eclipse的控制台显示有问题,关闭Limit console output
  3. wordpress获取各类页面链接的函数总结
  4. java getSource()和 getActionCommand()区别
  5. 自定义新浪微博分享按钮
  6. python3调用js_关于python3运行JS文件的问题
  7. 在java创建线程结果_Java创建线程的三种方式
  8. NYOJ 570欧拉函数求和(欧拉函数数论入门)
  9. python字符串左_Python去除字符串左边指定字符
  10. 索引超出矩阵维度怎么修改程序_seo关键词优化工具怎么收费