HDOJ【5575】【单调栈】【可并堆】
好久木有做题啦!
/* I will wait for you */#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <string>
#include <ext/pb_ds/priority_queue.hpp>
#define fi first
#define se secondusing namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef map<int, int> mii;const int maxn = 500010;
const int maxm = 1010;
const int maxs = 26;
const int inf = 0x3f3f3f3f;
const int P = 1000000007;
const double eps = 1e-6;inline ll read()
{ll x = 0, f = 1; char ch = getchar();while (ch < '0' || ch > '9')f = (ch == '-' ? -1 : 1), ch = getchar();while (ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();return x * f;
}struct query
{int x, y, type;
} e[maxn];bool operator < (query a, query b)
{return a.y > b.y;
}int n, m, top, h[maxn], sta[maxn], sum_1[maxn], sum_2[maxn], dp[maxn];__gnu_pbds::priority_queue<query> pri[maxn];void init()
{for (int i = 1; i <= n; i++) {pri[i].clear(), dp[i] = 0;sum_1[i] = sum_2[i] = 0;}
}int main()
{int T = read(), cnt = 0;while (T--) {n = read(), m = read(), init();for (int i = 1; i <= n - 1; i++)h[i] = read();h[0] = h[n] = inf;for (int i = 1; i <= m; i++) {int x = read(), y = read() + 1, t = read();e[i] = (query) {x, y, t};pri[x].push(e[i]), sum_2[x] += (t == 0);}top = sta[0] = 0;for (int i = 1; i <= n; i++) { while (h[i] > h[sta[top]]) {int cnt_1 = 0, cnt_2 = 0, hig = 0;int ans = sum_1[i] + sum_2[i], j = sta[top];while (!pri[i].empty() && pri[i].top().y <= h[j]) {query tmp = pri[i].top(); pri[i].pop();if (tmp.y != hig) {sum_1[i] += cnt_1, cnt_1 = 0;sum_2[i] -= cnt_2, cnt_2 = 0;ans = max(ans, sum_1[i] + sum_2[i]);hig = tmp.y;}cnt_1 += (tmp.type == 1);cnt_2 += (tmp.type == 0);}sum_1[i] += cnt_1, sum_2[i] -= cnt_2;ans = max(ans, sum_1[i] + sum_2[i]);dp[i] = max(dp[i], dp[j] + ans);sum_1[i] += sum_1[j], sum_2[i] += sum_2[j];top -= 1, pri[i].join(pri[j]);}int cnt_1 = 0, cnt_2 = 0, hig = 0;int ans = sum_1[i] + sum_2[i], j = sta[top];while (!pri[i].empty() && pri[i].top().y <= h[i]) {query tmp = pri[i].top(); pri[i].pop();if (tmp.y != hig) {sum_1[i] += cnt_1, cnt_1 = 0;sum_2[i] -= cnt_2, cnt_2 = 0;ans = max(ans, sum_1[i] + sum_2[i]);hig = tmp.y;}cnt_1 += (tmp.type == 1);cnt_2 += (tmp.type == 0);} sum_1[i] += cnt_1, sum_2[i] -= cnt_2;ans = max(ans, sum_1[i] + sum_2[i]);dp[i] = max(dp[i], dp[j] + ans); sta[++top] = i;}printf("Case #%d: %d\n", ++cnt, dp[n]);}return 0;
}
HDOJ【5575】【单调栈】【可并堆】相关推荐
- bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】
参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...
- POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)
题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了 ...
- POJ - 2201 Cartesian Tree(笛卡尔树-单调栈/暴跳父亲)
题目链接:点击查看 题目大意:给出n个节点的key和val,构造出其笛卡尔树的原型 笛卡尔树的定义: 所谓笛卡尔树,就是将给定的n个二元组(key,val)建成一棵树.使得: 如果只关注key,那么这 ...
- 单调栈之Next Greater Number
单调栈之Next Greater Number 栈(stack) 是很简单的⼀种数据结构, 先进后出的逻辑顺序, 符合某些问 题的特点, ⽐如说函数调⽤栈. 单调栈实际上就是栈, 只是利⽤了⼀些巧妙的 ...
- 【贪心-单调栈】中山纪念中学暑期游Day12——灵知的太阳信仰
前言 感觉自己就没弄懂过 单调栈\队列相关的优化... ... 题目 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰, ...
- P1823 [COI2007] Patrik 音乐会的等待 单调栈
单调栈 链接 栈底维护的是目前身高最高的人,因为在此人前的人因为此人的存在不能与后来的人联系了,所以如果遇到身高高的人就不断让比他身高矮的人出栈即可.不过我们还要留意身高相同的情况. 由于要考虑重复的 ...
- 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...
- POJ2796 Feel Good(单调栈)
题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...
- 【单调栈 前缀和 异或】7.21序列求和
还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...
- 栈与队列7——单调栈结构(进阶问题)
题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...
最新文章
- VC6在64位Win7下调试无法退出的问题(缺少TLLOC.DLL和DM.dll)
- JavaScript实现完整的ComplexNumber复数类(附完整源码)
- java hashmap 输出_JAVA如何把HashMap内容输出到文本文件
- NAT STURN,ICE
- 计算机机房建设目标是什么,计算机机房建设方案计划.doc
- 如何绘制逻辑图 — 3.要素的属性:粒度与分层
- shared_ptr四宗罪
- 蓝鸥iOS开发教程C语言——while语句
- Http通信(HttpClient)
- minecraft_如何使用MultiMC管理Minecraft实例和模组
- Android Studio+SDK+tools下载、安装、配置及应用程序运行(详细,亲测)
- 西安电子科技大学计算机考研资料汇总
- 电脑右下角没有看到小喇叭图标了该怎么办
- reg query报错系统找不到指定的注册表项或值。
- html css jsp 数据库,html、css、js、jsp的区别是什么?
- 全球及中国停车信息系统行业研究及十四五规划分析报告
- 3、组推荐系统及其应用研究---张玉洁(2016)
- SBW(线控转向系统Matlab/Simulink模型搭建)
- 用eclipse配置hibernate的hbm.xml文件时遇到的一些问题
- jodconverter,openoffice文档转换pdf 所需jar包
热门文章
- 世界道路协会PIARC发布《智能道路分类》研究报告
- 单商户商城系统功能拆解51—应用中心—评价助手
- xposed框架android9.0,安卓框架虚拟机VirtualXposed v0.17.1 清爽版 支持安卓9.0系统
- lm2776dbvr_收购LM5007MM大量回收LM2776DBVR
- 八年级使用计算机的教案,苏科版信息技术八年级1.2.2《用计算机制作逐帧动画》教案1.doc...
- 如何增加移动应用程序中的用户保留
- 如何将录音转换成文字?实现录音转文字简单方法介绍
- lisp地物代码_调土地地类代码表
- Using UVAtlas (Direct3D 9) 翻译
- 保险业务与系统——LOMA 290 保险公司运营——第八讲——产品销售