A.Equivalent Prefixes(ST算法)
Equivalent Prefixes
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
where RMQ(w,l,r)RMQ(w,l,r) denotes the index of the minimum element among wl,wl+1,…,wrwl,wl+1,…,wr.
Since the array contains distinct elements, the definition of minimum is unambiguous.
Bobo has two arrays a and b each with n distinct elements. Find the maximum number p≤np≤n where {a1,a2,…,ap}{a1,a2,…,ap} and {b1,b2,…,bp}{b1,b2,…,bp} are equivalent.
输入描述:
The input consists of several test cases and is terminated by end-of-file. The first line of each test case contains an integer n.
The second line contains n integers a1,a2,…,ana1,a2,…,an.
The third line contains n integers b1,b2,…,bnb1,b2,…,bn. * 1≤n≤1051≤n≤105
* 1≤ai,bi≤n1≤ai,bi≤n
* {a1,a2,…,an}{a1,a2,…,an} are distinct.
* {b1,b2,…,bn}{b1,b2,…,bn} are distinct.
* The sum of n does not exceed 5×1055×105.
输出描述:
For each test case, print an integer which denotes the result.
输入
2
1 2
2 1
3
2 1 3
3 1 2
5
3 1 5 2 4
5 2 4 3 1
输出
1
3
4 算法:ST表 思路:设置最小数的下标为pos = 0,依次添加一组数,并于前面的最小数进行比较,看此数是否符合条件,每次添加一组数有三种情况。
第一种:这组数全部小于最小数,这组数是可以的,更新最小数下标,判断下一组数。
第二种:这组数全部大于最小数,递归判断区间(pos + 1, r)里是否有最小数,如果有继续递归,直到l >= r时,返回true。如果没有返回false。
第三种:剩余的只有一种可能了,既有大于,也有小于,显然,这种可能时不存在的,直接跳出循环,输出结果。
#include <iostream>
#include <cstdio>
#include <cmath> using namespace std; typedef unsigned long long ull; int a[];
int b[];
int pos, n;
int dpa[][][]; //三种状态: 1、当前区间的首元素的下标
// 2、从首元素开始延伸的的长度
// 3、0表示我当前期间内的最小值,1表示的当前区间内最小值的下标
int dpb[][][]; void ST_init() {
for(int i = ; i < n; i++) {
dpa[i][][] = a[i];
dpa[i][][] = i;
dpb[i][][] = b[i];
dpb[i][][] = i;
}
int nlen = (int)(log((double)(n)) / log(2.0));
for(int j = ; j <= nlen; j++) {
for(int i = ; i < n; i++) {
if(dpa[i][j - ][] < dpa[i + ( << (j - ))][j - ][]) {
dpa[i][j][] = dpa[i][j - ][];
dpa[i][j][] = dpa[i][j - ][];
} else {
dpa[i][j][] = dpa[i + ( << (j - ))][j - ][];
dpa[i][j][] = dpa[i + ( << (j - ))][j - ][];
}
if(dpb[i][j - ][] < dpb[i + ( << (j - ))][j - ][]) {
dpb[i][j][] = dpb[i][j - ][];
dpb[i][j][] = dpb[i][j - ][];
} else {
dpb[i][j][] = dpb[i + ( << (j - ))][j - ][];
dpb[i][j][] = dpb[i + ( << (j - ))][j - ][];
}
}
}
} bool ST_query(int l, int r) {
if(l >= r) { //当查询区间小于1时,表示可行
return true;
}
int k = (int)(log((double)(r - l + )) / log(2.0));
int mina;
int minb;
if(dpa[l][k][] < dpa[r - ( << k) + ][k][]) {
mina = dpa[l][k][];
} else {
mina = dpa[r - ( << k) + ][k][];
}
if(dpb[l][k][] < dpb[r - ( << k) + ][k][]) {
minb = dpb[l][k][];
} else {
minb = dpb[r - ( << k) + ][k][];
}
if(mina == minb) {
return ST_query(mina + , r);
}
return false;
} int main() {
while(~scanf("%d", &n)) {
for(int i = ; i < n; i++) {
scanf("%d", &a[i]);
}
for(int i = ; i < n; i++) {
scanf("%d", &b[i]);
}
ST_init();
pos = ;
int i;
for(i = ; i < n; i++) {
if(a[pos] > a[i] && b[pos] > b[i]) {
pos = i;
} else if(a[pos] < a[i] && b[pos] < b[i]) {
if(!ST_query(pos + , i)) {
break;
}
} else {
break;
}
}
printf("%d\n", i);
}
return ;
}
A.Equivalent Prefixes(ST算法)的更多相关文章
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第一场) - A - Equivalent Prefixes - 单调栈
A - Equivalent Prefixes - 单调栈 题意:给定两个n个元素的数组a,b,它们的前p个元素构成的数组是"等价"的,求p的最大值."等价"的 ...
- ST算法
作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1. 方法:ST算法分成两部分:离线预处 ...
- 求解区间最值 - RMQ - ST 算法介绍
解析 ST 算法是 RMQ(Range Minimum/Maximum Query)中一个很经典的算法,它天生用来求得一个区间的最值,但却不能维护最值,也就是说,过程中不能改变区间中的某个元素的值.O ...
- RMQ问题之ST算法
RMQ问题之ST算法 RMQ(Range Minimum/Maximum Query)问题,即区间最值问题.给你n个数,a1 , a2 , a3 , ... ,an,求出区间 [ l , r ]的最大 ...
- RMQ之ST算法模板
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; ],M ...
- CodeForces 359D (数论+二分+ST算法)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47319 题目大意:给定一个序列,要求确定一个子序列,①使得该子序 ...
- RMQ问题(线段树+ST算法)
转载自:http://kmplayer.iteye.com/blog/575725 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ ...
- [POJ3264]Balanced Lineup(RMQ, ST算法)
题目链接:http://poj.org/problem?id=3264 典型RMQ,这道题被我鞭尸了三遍也是醉了…这回用新学的st算法. st算法本身是一个区间dp,利用的性质就是相邻两个区间的最值的 ...
随机推荐
- 面试常考的js题目(一)
1.找出dom文档中某个元素下面的所有文字(面试写的一塌糊涂,回来重写的) 1.返回回数组形式的 function getText(ele) { if (ele.nodeType === 3) { r ...
- ion-icon
观察默认的使用 关于Ion-icon 图标的自定义,首先,看一看默认内置的图标的显示,是怎么来的 可以看到默认的路径为:/svg/ios-xxx.svg 自定义实现 那么这种路径是哪里来的,明显是an ...
- golang(6): 接口 & 反射
接口详解 // 举例:sort包中的 Sort 函数,如下: func Sort(data Interface) Sort sorts data. It makes one call to data. ...
- Qt 按键键值 与 相关字符串 的映射表(转)
Qt快捷键 映射 "Esc",/*Qt::Key_Escape 0x01000000 */ "Tab",/*Qt::Key_Tab 0x01000001 ...
- PostgreSQL 自增主键
1.自增主键:2.创建序列 一.使用SERIAL自增主键 create table test_no( id SERIAL primary key, name ) ); 二.创建序列 INCREMENT ...
- Python新式类与经典类(旧式类)的区别
看写poc的时候看到的,思考了半天,现在解决了 转载自http://blog.csdn.net/zimou5581/article/details/53053775 Python中类分两种:旧式类和新 ...
- Windows Electron初探
最近闲来无事,玩玩electron. 1.安装nodejs 下载地址:http://nodejs.cn/download/,下载64位.安装完成后,打开C:\Program Files\nodejs\ ...
- python 有用的库
1.Faker pip3 install faker官网: https://faker.readthedocs.io/en/master/providers.htmlgithub: https://g ...
- 单节点oracle、ASM 详细安装步骤
目录 1.安装环境 2.系统要求 2.1 Linux安装Oracle系统要求 1.查看RAM和交换空间以及磁盘大小 2.检查所需软件包 3.配置host和主机名 2.2修改操作系统核心参数 1.创建相 ...
- [CF 1238F] The Maximum Subtree 树DP
题意 给定一颗树,求这个树的最大子树,且这个子树是一个good-tree. good-tree的定义是:每个节点可以表示成一个数值区间,而树上的边表示两个点表示的数值区间相交. 题解 通过分析可以发现 ...