题目链接: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的更多相关文章

  1. Gym 100801 J. Journey to the “The World’s Start” DP+单调队列优化+二分

    http://codeforces.com/gym/100801 题目大意:有从左到右有n个车站,有n-1种车票,第i种车票一次最多可以坐 i 站(1<=i<=n)   每种票有固定的价钱 ...

  2. 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 ...

  3. Gym 100801J Journey to the "The World's Start"(二分+单调队列)

    题意: 现在有1,2,3...N这N个站, 给定限定时间Limt,  N-1种票的价格, 分别对应一个最远距离,  叫你选择一种票, 满足可以在规定时间到达N站台,而且价格最低 思路: 如果买距离为L ...

  4. Gym 100342E Minima (暴力,单调队列)

    3e7暴力,800ms+过,单调队列维护区间最小值. #include<bits/stdc++.h> using namespace std; typedef long long ll; ...

  5. Gym - 101234J Zero Game (单调队列)

    题意:有一个长度为n的01序列,你可以移动k次,每次将一个数移到任意一个位置,求经过操作后区间连续最大的连续0的个数. “移动”操作看似情况很复杂,不好讨论,但其实无非就两种情况: 一.移动的是1:显 ...

  6. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  7. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】

    题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...

  8. codeforces 251A Points on Line(二分or单调队列)

    Description Little Petya likes points a lot. Recently his mom has presented him n points lying on th ...

  9. BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列

    传送门 求仙人掌的直径,可以由求树的直径进行拓展,只需要在环上特殊判断. 沿用求树的直径的DP,对于一条不在任何环内的边,直接像树的直径一样转移,然后考虑环的影响. 设环长为\(cir\),在\(df ...

随机推荐

  1. HDU 2113 Secret Number

    http://acm.hdu.edu.cn/showproblem.php?pid=2113 Problem Description 有一天, KIKI 收到一张奇怪的信, 信上要KIKI 计算出给定 ...

  2. 数据输出保存生成word文档

    ob_start(); //打开缓冲区 $header_str = '<html xmlns:o="urn:schemas-microsoft-com:office:office&qu ...

  3. phpMyadmin导入导出数据中出现的错误处理

    1 2

  4. Java容器深入浅出之String、StringBuffer、StringBuilder

    对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面.事实上,Java字符串类的底层是通过数组来实现的.具体来说,String类是固定长度的数组,StringBuf ...

  5. TDDL调研笔记

    一,TDDL是什么 Taobao Distributed Data Layer,即淘宝分布式数据层,简称TDDL .它是一套分布式数据访问引擎 淘宝一个基于客户端的数据库中间件产品 基于JDBC规范, ...

  6. 【uoj#174】新年的破栈 贪心

    题目描述 给你一个长度为 $n$ 的序列和一个空的双端队列,每次进行3种操作种的一种: 1.将序列中编号最小的数加入到双端队列的队尾:2.从双端队列的队尾取出一个数:3.从双端队列的队头取出一个数. ...

  7. 【Linux】无法将 Ethernet0 连接到虚拟网络“VMnet8”

    Linux安装centos之后,可能会出现ipconfig命令之后没有看到eth0信息,只有lo.log日志包的错为:无法将 Ethernet0 连接到虚拟网络“VMnet8” 解决办法有: 1.在虚 ...

  8. 【刷题】BZOJ 2096 [Poi2010]Pilots

    Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是 ...

  9. 聊聊flink的CsvTableSource

    序 本文主要研究一下flink的CsvTableSource TableSource flink-table_2.11-1.7.1-sources.jar!/org/apache/flink/tabl ...

  10. Android Native jni 编程 Android.mk 文件编写

    LOCAL_PATH 必须位于Android.mk文件的最开始.它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径. LOCAL_PATH := $(call my-d ...