Codeforces 1195E OpenStreetMap 单调队列套单调队列
题意:给你一个n * m的矩阵,问所有的a * b的子矩阵的最小的元素的和是多少。题目给出了矩阵中的数的数据生成器。
思路:如果这个问题是1维的,即求所有区间的最小元素的和,用单调队列O(n)就可以做。对于这个问题,我们先给每一行建一个单调队列,枚举子矩阵的行坐标的左端点和右端点。在行的左右端点的基础上,用另一个单调队列维护子矩阵每一行的最小值。
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define pii pair<int, int>
#define LL long long
#define db double
using namespace std;
const int maxn = 3001;
pii q[maxn];
int l, r;
int q3[maxn][maxn], l3[maxn], r3[maxn];
int a[maxn][maxn];
int n, m;
void init(int p, int L, int R) {
for (int j = L; j <= R; j++) {
int tmp = a[p][j];
while(l3[p] <= r3[p] && a[p][q3[p][r3[p]]] >= tmp) r3[p]--;
q3[p][++r3[p]] = j;
}
}
void maintain(int p, int L, int R) {
int tmp = a[p][R];
while(l3[p] <= r3[p] && q3[p][l3[p]] < L) l3[p]++;
while(l3[p] <= r3[p] && a[p][q3[p][r3[p]]] >= tmp) r3[p]--;
q3[p][++r3[p]] = R;
}
int query(int p) {
return a[p][q3[p][l3[p]]];
}
int main() {
int a1, b1, now, x, y, z;
scanf("%d%d%d%d", &n, &m, &a1, &b1);
scanf("%d%d%d%d", &now, &x, &y, &z);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = now;
now = ((LL)now * x + y) % z;
}
}
for (int i = 1; i <= n; i++) l3[i] = 1;
LL ans = 0;
for (int i = 1; i <= n; i++) {
init(i, 1, b1 - 1);
}
for (int l1 = 1, r1 = b1; r1 <= m; l1++, r1++) {
l = 1, r = 0;
for (int j = 1; j <= a1; j++) {
maintain(j, l1, r1);
int tmp = query(j);
while(l <= r && q[r].second >= tmp) r--;
q[++r] = make_pair(j, tmp);
}
ans += q[l].second;
for (int l2 = 2, r2 = a1 + 1; r2 <= n; l2++, r2++) {
while(l <= r && q[l].first < l2) l++;
maintain(r2, l1, r1);
int tmp = query(r2);
while(l <= r && q[r].second >= tmp) r--;
q[++r] = make_pair(r2, tmp);
ans += q[l].second;
}
}
printf("%lld\n", ans);
}
Codeforces 1195E OpenStreetMap 单调队列套单调队列的更多相关文章
- Codeforces - 1195E - OpenStreetMap - 单调队列
https://codeforc.es/contest/1195/problem/E 一个能运行但是会T的版本,因为本质上还是\(O(nmab)\)的算法.每次\(O(ab)\)初始化矩阵中的可能有用 ...
- Codeforces 1195E. OpenStreetMap (单调队列)
题意:给出一个n*m的矩形.询问矩形上所有的a*b的小矩形的最小值之和. 解法:我们先对每一行用单调栈维护c[i][j]代表从原数组的mp[i][j]到mp[i][j+b-1]的最小值(具体维护方法是 ...
- bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...
- 【learning】 单调队列与单调栈用法详解
1.单调栈 单调栈是指一个栈内部的元素具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈. 其具有以下两个性质: 1,满足栈底到栈顶的元素具有严格单调性. 2,满足栈的先进后出特性,越靠近栈顶的 ...
- 单调栈and单调队列(此文太多坑了,以后再填)
单调栈 单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性,可能为单调递增,也可能为单调递减. 性质: 单调栈里的元素具有单调性 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除 使用单调 ...
- 22.1.23Manacher算法、双端队列、单调栈
22.1.23Manacher算法.双端队列.单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串.(回文就是正着读和倒着读一样的结构). 2)算 ...
- JAVA多线程(二) 并发队列和阻塞队列
github代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...
- C ~ 链式队列与循环队列
此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...
- C语言 复杂队列(链表队列)
//复杂的队列二 --链表队列 #include<stdio.h> #include<stdlib.h> #define datatype int struct queueli ...
随机推荐
- OpenStack虚拟机网络问题
当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤 1. Security Group全部打开,这是最基本的,但是很多人容易忘记 其实遇到过无数这种场景了,Debug了半天网络 ...
- kill命令的几种信号
1 HUP: hangup 2 INIT: 相当于 Ctrl + c 9 KILL 15 TERM: Terminate (kill 的默认信号) 18 CONT: Continue (从STOP信号 ...
- Windows下安装的Jenkins修改默认端口号8080(修改配置文件的方式)
1.首先在Windows下找到Jenkins安装目录.2.在安装目录下找到jenkins.xml文件 3.打开jenkins.xml文件,找到httpPort=8080 4.修改成你想要的端口号即可, ...
- php strtoupper()函数 语法
php strtoupper()函数 语法 作用:把所有字符转换为大写 语法:strtoupper(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:strtouppe ...
- JS中的作用域及闭包
1.JS中的作用域 在 es6 出现之前JS中只有全局作用域和函数作用域,没有块级作用域,即 JS 在函数体内有自己的作用域,但是如果不是在函数体的话就全部都是全局作用域.比如在 if.for 等有 ...
- 【HDOJ6599】I Love Palindrome String(PAM,manacher)
题意:给出一个由小写字母组成的长为n的字符串S,定义他的子串[L,R]为周驿东串当且仅当[L,R]为回文串且[L,(L+R)/2]为回文串 求i=[1,n] 所有长度为i的周驿东串的个数 n<= ...
- BUUCTF | [SUCTF 2019]EasySQL (堆叠注入)
fuzz ing了一下,发现了一堆过滤: 同时发现了注入点,这个应该是var_dump()函数 ===============第二天的分割线 好吧我放弃了,找了一下wp 正确解:select 1;se ...
- [CSP-S模拟测试]:阴阳(容斥+计数+递推)
题目传送门(内部题16) 输入格式 第一行两个整数$n$和$m$,代表网格的大小.接下来$n$行每行一个长度为$m$的字符串,每个字符若为$W$代表这个格子必须为阳,若为$B$代表必须为阴,若为$?$ ...
- iOS 获取全局唯一标示符
这个方法用来产生一个唯一的标示符,每次调用都会不一样,所以可以用当作一些临时缓存文件的名字 NSString *identifier = [[NSProcessInfo processInfo] gl ...
- (选做)实现mypwd
选做 实现mypwd 实验内容: 1.学习pwd命令. 2.研究pwd实现需要的系统调用(man -k; grep),写出伪代码. 3.实现mypwd. 4.测试mypwd. 实验步骤: 学习pwd命 ...