2019牛客暑期多校赛(第一场) A Equivalent Prefixes(单调栈)
传送门:https://ac.nowcoder.com/acm/contest/881/A
题意:给定两个数组a和b,求最大的p,满足在区间 [1,p] 中任何区间的两个数组的最小值的下标都相等。
思路:先用单调栈,跑出数组 a 和 b 中每个元素的左边第一个比他小的数的位置和右边第一个比他小的数的位置,左边的下标加1,右边的下标减1,那么就得到了每个数字的以这个数为区间的最小值的区间。
然后再对于两个数组的每个数字的区间去遍历。对于一个总长度为n的数组来说,从第一个去开始比较,如果这两个数的左右区间界限都相等,就继续。如果左区间相等但是右区间不一样的话,那么这个时候就要缩小空间区域了,取两者中的最小值当做新的区间长度再去跑一遍过程,如果都不一样直接就跳出循环。这样一步一步缩小区间求解。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const int inf = 0x3f3f3f3f;
int dir[][]={{,},{,},{,},{,-},{-,},{-,-},{,-},{-,}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
const int N=;
int la[N],ra[N],lb[N],rb[N],sta[N],stb[N],a[N],b[N];
inline int read() {
char c=getchar(); int x=, f=;
while(c<''|c>'') {if(c=='-') f=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*f;
}
ll q_pow(ll a,ll b,ll mod){
ll anss=;
while(b){
if(b&) anss=anss*a%mod;
a=a*a%mod;
b>>=;
}
return anss;
}
ll q_mul(ll a,ll b,ll mod){
ll anss=;
while(b){
if(b&) anss=(anss+a)%mod;
a=(a+a)%mod;
b>>=;
}
return anss;
}
int main(int argc, char * argv[]) {
std::ios::sync_with_stdio(false);
int n;
while(cin>>n){
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++) cin>>b[i];
int top1=;
for(int i=;i<=n;i++){
while(top1&&a[sta[top1-]]>=a[i]){
top1--;
}
la[i]=(top1==)?:sta[top1-];
sta[top1++]=i;
}
top1=;
for(int i=n;i>=;i--){
while(top1&&a[sta[top1-]]>=a[i]) top1--;
ra[i]=(top1==)?(n+):sta[top1-];
sta[top1++]=i;
}
int top2=;
for(int i=;i<=n;i++){
while(top2&&b[stb[top2-]]>=b[i]){
top2--;
}
lb[i]=(top2==)?:stb[top2-];
stb[top2++]=i;
}
top2=;
for(int i=n;i>=;i--){
while(top2&&b[stb[top2-]]>=b[i]) top2--;
rb[i]=(top2==)?(n+):stb[top2-];
stb[top2++]=i;
}
for(int i=;i<=n;i++){
la[i]=la[i]+;
ra[i]=ra[i]-;
lb[i]=lb[i]+;
rb[i]=rb[i]-;
}
// for(int i=1;i<=n;i++){
// cout<<la[i]<<" "<<ra[i]<<" "<<lb[i]<<" "<<rb[i]<<endl;
// }
for(int i=;i<=n;i++){
if(la[i]==lb[i]&&ra[i]==rb[i]){
continue;
}
else if(la[i]==lb[i]&&ra[i]!=rb[i])
n=min(ra[i],rb[i]);
else break;
}
cout<<n<<endl;
}
return ;
}
2019牛客暑期多校赛(第一场) A Equivalent Prefixes(单调栈)的更多相关文章
- 2019 牛客暑期多校 第八场 A All-one Matrices (单调栈+前缀和)
题目:https://ac.nowcoder.com/acm/contest/888/A 题意:找全1矩阵的个数,并且这个全1矩阵不被其他全1矩阵包含 思路:这里引用付队说的话 -> { 这类问 ...
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
- 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)
Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- 2019牛客暑期多校赛(第三场)B-求01串中的最长01数量相等的子串和子序列
https://ac.nowcoder.com/acm/contest/883/B 首先先把0所在的位置变-1,1所在位置变1,然后统计一个前缀和,用sum[i]表示. 那么如果从起点开始的话只要满足 ...
- 2019牛客暑期多校第五场题解ABGH
A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...
- [题解] 2019牛客暑期多校第三场H题 Magic Line
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...
- 2019牛客暑期多校第六场题解ABDJ
A.Garbage Classification 传送门 题意:给你两个串,第一个串s由小写字母组成,第二个串t由dwh组成,长度为26,分别表示字母a到z代表的字符.现在要你判断: 如果字符串中‘h ...
- 【2019牛客暑期多校第三场】J题LRU management
题目链接 题意 好吧,这道题我其实看都没看过,队友跟我说了说这道题是模拟题,卡时间.然后我就上了-- 大致就是维护一个线性表,然后有两种操作:插入.查询 插入时,如果这个值(string)之前出现过, ...
随机推荐
- Python入门教程 超详细1小时学会Python
Python入门教程 超详细1小时学会Python 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的 ...
- https://www.cnblogs.com/chinabin1993/p/9848720.html
转载:https://www.cnblogs.com/chinabin1993/p/9848720.html 这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感 ...
- pycharm同时使用python2.7和python3.5设置方法
pycharm同时使用python2.7和python3.5设置方法 - CSDN博客https://blog.csdn.net/qwerty200696/article/details/530159 ...
- USACO 2006 November Gold Corn Fields /// 状压 oj23941
题目大意: 输入n m 接下来n行m列 0表示不能种玉米 1表示能 要求种玉米位置的上下左右四连通区域不能种玉米 输出方案数 Sample Input 2 31 1 10 1 0 Sample Out ...
- ztree 树状图——例
效果: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- CF596D Wilbur and Trees
题意:有一些高度为h的树在数轴上.每次选择剩下的树中最左边或是最右边的树推倒(各50%概率),往左倒有p的概率,往右倒1-p. 一棵树倒了,如果挨到的另一棵树与该数的距离严格小于h,那么它也会往同方向 ...
- Oracle Database 18c数据库安装步骤
1.Oracle官网登录下载https://login.oracle.com/mysso/signon.jsp WINDOWS.X64_180000_db_home.zip 2.D盘根目录新建文件夹: ...
- python Mean Squared Error vs. Structural Similarity Measure两种算法的图片比较
# by movie on 2019/12/18 import matplotlib.pyplot as plt import numpy as np from skimage import meas ...
- Loadrunner安装与破解【转】
Loadrunner安装与破解 一.下载 我的LoadRunner 11下载地址是: http://pan.baidu.com/s/1qYFy2DI 二.安装 1.启动安装程序 运行setup.exe ...
- Centos--swoole平滑重启服务
平滑重启: 已经打开的服务: 首先在server服务中为进程添加名字: /** * @param $server */ public function onStart($server) { swool ...