单调队列 + 组合数统计 Gym 101102D
题目链接:http://codeforces.com/gym/101102/problem/D
题目大意:给你一个n*m的矩阵,矩阵里面的数值范围为[1,1e9]。这个矩阵有一个值,如果相邻的多个数字是一样的,那么val += 他们的组合数,例如 1 1 1,那么就是val就是6.
问最后这个矩阵是val是多少?
思路:
我们固定右端点,先统计出上方有几个和他数值相同的数字,并把这个定义成这个位置的高,然后每次往统计以这个点为右下角的端点数即可。然后暴力右下角就是O(n*n)
我们发现,如果要每次暴力相同的数字,那么要知道前面有几个数字的高度,然后O(n)的暴力一遍是可以的,但是这样会TLE
所以我们知道,如果高度是>=目前的h[i][j]的高度的,那么我们就ans[i][j] += h[i][j] * (j - k +1),其中k为高度<h[i][j]出现的位置。(这个东西用单调队列或者单调栈维护一下就好了)
若是出现a[i][j] == a[i][k - 1],那么我们就只需要ans[i][j] += ans[i][k - 1]即可
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
int n, m;
int h[maxn][maxn], a[maxn][maxn], cnt[maxn][maxn]; int main(){
int t; cin >> t;
while (t--){
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++){
for (int j = ; j <= m; j++){
scanf("%d", &a[i][j]);
h[i][j] = ;
if (a[i - ][j] == a[i][j]) h[i][j] += h[i-][j];
cnt[i][j] = ;
}
}
LL res = ;
for (int i = ; i <= n; i++){
deque<pair<int, int> > que;
for (int j = ; j <= m; j++){
if (a[i][j] != a[i][j - ]){
while (!que.empty()) que.pop_back();
res += h[i][j]; cnt[i][j] = h[i][j];
que.push_back(mk(h[i][j], j));
}
else {
pair<int, int> p = mk(h[i][j], j);
while (!que.empty()){
if (que.back().fi >= p.fi){
p.se = que.back().se;
que.pop_back();
}
else break;
}
cnt[i][j] = h[i][j] * (j - p.se + );
if (a[i][j] == a[i][p.se - ]) cnt[i][j] += cnt[i][p.se - ];
res += cnt[i][j];
que.push_back(p);
}
}
}
printf("%lld\n", res);
}
return ;
}
/*
549
3 3
1 2 1
1 1 1
1 1 1
ans = 25 4564
3 2
1 2
1 1
1 1
ans = 13 45609
3 2
2 1
1 1
1 1
ans = 13
*/
单调队列 + 组合数统计 Gym 101102D的更多相关文章
- Gym 100801 J. Journey to the “The World’s Start” DP+单调队列优化+二分
http://codeforces.com/gym/100801 题目大意:有从左到右有n个车站,有n-1种车票,第i种车票一次最多可以坐 i 站(1<=i<=n) 每种票有固定的价钱 ...
- Gym - 100570C: Subrect Query (巧妙的单调队列)
De Prezer loves rectangles.He has a n × m rectangle which there is a number in each of its cells. We ...
- Gym 100801J Journey to the "The World's Start"(二分+单调队列)
题意: 现在有1,2,3...N这N个站, 给定限定时间Limt, N-1种票的价格, 分别对应一个最远距离, 叫你选择一种票, 满足可以在规定时间到达N站台,而且价格最低 思路: 如果买距离为L ...
- Gym 100342E Minima (暴力,单调队列)
3e7暴力,800ms+过,单调队列维护区间最小值. #include<bits/stdc++.h> using namespace std; typedef long long ll; ...
- Gym - 101234J Zero Game (单调队列)
题意:有一个长度为n的01序列,你可以移动k次,每次将一个数移到任意一个位置,求经过操作后区间连续最大的连续0的个数. “移动”操作看似情况很复杂,不好讨论,但其实无非就两种情况: 一.移动的是1:显 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...
- codeforces 251A Points on Line(二分or单调队列)
Description Little Petya likes points a lot. Recently his mom has presented him n points lying on th ...
- BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列
传送门 求仙人掌的直径,可以由求树的直径进行拓展,只需要在环上特殊判断. 沿用求树的直径的DP,对于一条不在任何环内的边,直接像树的直径一样转移,然后考虑环的影响. 设环长为\(cir\),在\(df ...
随机推荐
- erlang调优方法
1. 来自Scaling Erlang的方法 内核调优: # Increase the ipv4 port range: sysctl -w net.ipv4.ip_local_port_range= ...
- DWZ-JUI+UEditor第二次不显示,UEditor异步加载第二次不显示的解决方案
使用UEditor-1.4.3中遇到第一次跳转到使用UEditor的界面后,编辑器加载正常,返回后第二次再跳转到这个界面就出现UEditor无法正常加载, 也没百度到答案,看UEditor源码,发现这 ...
- 模拟jq的设置样式
//需求,创建一个div,添加到页面上,给div添加属性 //面向对象开发,构造函数创建类 function divTag(){ this.div1=document.createElement('d ...
- 【Leetcode】322. Coin Change
You are given coins of different denominations and a total amount of money amount. Write a function ...
- 【移动端debug-2】Flexbox在移动端的兼容实践
最近在项目中用到了flexbox,总结一下使用心得. 一.什么是flexbox,干嘛使的? 曾几何时,我们特别希望能像word一样,在排版时有个分散对齐选项(平均分配子元素宽度)这样我就可以任意在父元 ...
- 英文报道:China challenged Australian warships in South China Sea, reports say
学习地道新闻英语表达,以下文章来自CNN By Ben Westcott and Jamie Tarabay, CNN Updated 0830 GMT (1630 HKT) April 20, 20 ...
- oracle 如何查看pga
进去命令行 输入 sqlplus username/password@dbname 回车 进入数据库输入 show parameter pga 回车
- Docker学习笔记三:Docker部署Java web系统
Docker部署Java Web系统 1.在root目录下创建一个路径test/app mkdir test && cd test&& mkdir app && ...
- 【BZOJ4912】天才黑客(最短路,虚树)
[BZOJ4912]天才黑客(最短路,虚树) 题面 BZOJ 洛谷 题解 \(Anson\)爷讲过的题目,然而我还是不会做 只有照着\(zsy\)的程序打我才会做....果然太弱了. 这道题目显然是把 ...
- 【BZOJ1491】【NOI2007】社交网络(最短路,动态规划)
[BZOJ1491][NOI2007]社交网络(最短路,动态规划) 题面 BZOJ 洛谷 图片是假的,只能到OJ上看 Description 在社交网络(socialnetwork)的研究中,我们常常 ...