单调栈
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
Educational Codeforces Round 23 A-F
感觉这种比赛就是拼手速啊QwQ A.Treasure Hunt 题目大意:平面直角坐标系中给定起点和终点,每次可以从(a,b)走向(a+x,b+y),(a-x,b-y),(a+x,b-y),(a-x,b+y)这四个点。 问从起点能否到达终点。 要求O(1)做法。 题解:这个第一遍提交还WA了QwQ。 首先如果这个是在一维直线上的,那么只要判断|x1-x2|是不是x的倍数即可。 在二维原创 2017-06-16 11:32:16 · 568 阅读 · 0 评论 -
[HNOI2008] 水平可见直线 - 单调栈
传送门 题解:沙茶题 #include #include #include #include #define N 50010 using namespace std; int s[N],ans[N]; struct Line{ int k,b,id; Line operator=(const Line &L) { this->k=L.k;this->b=原创 2017-08-05 15:07:56 · 428 阅读 · 3 评论 -
ARC 067 F Yakiniku Restaurants - 单调栈 - 前缀和
题目大意:(我翻译的开森) n个餐馆排成一条直线,相邻两个餐馆有个距离;m张餐票,每张最多能用一次,并且在不同的店使用收益不同。起点终点任意,问总收益减去总路程最大是多少。 n≤5000,m≤200n≤5000,m≤200n\le5000,m\le200 题解:区间确定的时候每张餐票会用在最划算的那个餐馆,反过来对每个餐票和每个餐厅考虑选择哪些区间会使得这张餐票用在这家餐馆。显然是左右遇到更...原创 2018-09-11 16:03:12 · 476 阅读 · 0 评论 -
ARC 063 F - 分治 - 线段树 -单调栈
题目大意:给出一个wxh的网格图,和n个点,求一个周长最大的矩形,满足这个矩形内部没有点。注意矩形边界上不算在内部。 n<=2e5 。 题解:考虑分治,现在要计算跨越中线的情况,那么维护上下两个单调栈,退栈的时候用线段树维护一下即可。边界情况比较多需要注意,直接做的复杂度是O(nlg2n)O(n\lg^2n)O(nlg2n)的,但是注意到答案至少是2(max(w,h)+1)2(\max(...原创 2018-09-18 10:50:23 · 297 阅读 · 0 评论 -
ARC 081 F - Flip and Rectangles - 单调栈
给你黑白网格,你要翻转一些行和列的颜色,求最大全黑子矩形。 题解:傻逼题。黑白无关紧要。对于一个子矩形来说,若其可行,那么第一行白格子位置对应的列要翻转,翻转后要每一行都全白或者全黑,意味着翻转后每一列都和上一列一样,意味着翻转前每一列都和上一列完全一样或者完全不同即可。然后递推h[i][j]表示(i,j)这个位置和(i,j+1)的位置最下延伸多少,那么每一行朴素暴力就是枚举左右然后乘以区间最小值...原创 2018-09-20 16:42:14 · 274 阅读 · 0 评论 -
ichi - 单调栈
题目大意: 你要建n座塔,每座塔有一个高度h,每一趟你可以带k块砖头,随意选择一个位置开始。每一步你可以向左或者向右或者向上爬(如果没有转头就必须摆一个砖头),问最少多少趟。 题解: 一开始考虑从下往上,gg。 考虑从上往下,每次选最高的一个,将其填到和其两侧一样高,这时可能会多出一些剩余,记录一下,并且合并两或三列。 这个过程可以用单调栈优化。 #include<bits/stdc++.h...原创 2018-12-08 15:25:57 · 194 阅读 · 0 评论 -
青春野狼不做姐控偶像的梦 - 线段树 - 扫描线 - 单调栈
题目大意:给你一个排列,多次询问,每次给你一个区间,问有多少子区间,数字取出来sort一遍是连续的一段。 题解: 考虑l=1,r=n咋做。 考虑一段合法,当且仅当max-min=r-l。 那么用个单调栈预处理每个数字在哪些[l,r]会成为最大/最小值,然后扫描线维护max-min+l的最小值,显然由于[r,r]是答案所以能取到最小值的位置都一定是答案。 考虑整个问题,就是每次在所有最小值的位置+1...原创 2018-12-25 18:19:02 · 355 阅读 · 0 评论 -
多线程 -单调栈
题目大意: 给你一列数,问有多少中将其划分为一个上升子序列一个下降子序列的方案,线性。 题解: 考虑求出每个点左第一个比他大的以及一直这么条能跳几步;类似左右大小共4种情况8个数组。然后枚举分界点,讨论一下即可。 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) #define Rep(i,v) re...原创 2018-12-31 19:23:04 · 315 阅读 · 0 评论