Equivalent Prefixes

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

Two arrays u and v each with m distinct elements are called equivalent if and only if RMQ(u,l,r)=RMQ(v,l,r)RMQ(u,l,r)=RMQ(v,l,r) for all 1≤l≤r≤m1≤l≤r≤m
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.
示例1

输入

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算法)的更多相关文章

  1. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  2. 2019牛客暑期多校训练营(第一场) - A - Equivalent Prefixes - 单调栈

    A - Equivalent Prefixes - 单调栈 题意:给定两个n个元素的数组a,b,它们的前p个元素构成的数组是"等价"的,求p的最大值."等价"的 ...

  3. ST算法

    作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1. 方法:ST算法分成两部分:离线预处 ...

  4. 求解区间最值 - RMQ - ST 算法介绍

    解析 ST 算法是 RMQ(Range Minimum/Maximum Query)中一个很经典的算法,它天生用来求得一个区间的最值,但却不能维护最值,也就是说,过程中不能改变区间中的某个元素的值.O ...

  5. RMQ问题之ST算法

    RMQ问题之ST算法 RMQ(Range Minimum/Maximum Query)问题,即区间最值问题.给你n个数,a1 , a2 , a3 , ... ,an,求出区间 [ l , r ]的最大 ...

  6. RMQ之ST算法模板

    #include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; ],M ...

  7. CodeForces 359D (数论+二分+ST算法)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47319 题目大意:给定一个序列,要求确定一个子序列,①使得该子序 ...

  8. RMQ问题(线段树+ST算法)

    转载自:http://kmplayer.iteye.com/blog/575725 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ ...

  9. [POJ3264]Balanced Lineup(RMQ, ST算法)

    题目链接:http://poj.org/problem?id=3264 典型RMQ,这道题被我鞭尸了三遍也是醉了…这回用新学的st算法. st算法本身是一个区间dp,利用的性质就是相邻两个区间的最值的 ...

随机推荐

  1. [Bzoj1001][BeiJing2006]狼抓兔子(网络流/对偶图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 看到大佬们都是对偶图过的,写了个最大流水过去了QAQ,网络流的无向图直接建双向边( ...

  2. C#控制台输入/输出语句

    Console.Read()方法:          从控制台窗口读取一个字符,返回int值 Console.ReadLine()方法:    从控制台窗口读取一行文本,返回string值 Conso ...

  3. 【原创】大叔经验分享(54)flume kudu sink运行一段时间kudu client报错

    flume kudu sink运行一段时间报错: 19/05/05 10:15:56 WARN client.ConnectToCluster: Error receiving a response ...

  4. 对ArrayList中的Person对象按照先年龄从大到小,相同年龄的再按照姓名(姓名是英文的)的字母顺序进行排序.

    ListDemo2.java ----------------- package com.fs.test; import java.util.ArrayList; import java.util.C ...

  5. Vue中,过滤器的使用方法!

    Vue.js允许自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和v-bind表达式.过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示:(借官方的 ...

  6. java基础2(Map)

    1.请简述Map 的特点 Map每个元素由键与值两部分组成 Map键不能重复,每个键对应一个值 键和值可以为null 2.说出Entry键值对对象遍历Map集合的原理. Map中存放的是两种对象,一种 ...

  7. C#程序集及程序集概念介绍

    一.源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了编译器将源文件编译成托管模块(中间语言和元数据),本文主要介绍如何将托管模块合并成程序集. 1.程序集的基本概念 2.程序 ...

  8. 企业QQ在线咨询接入

    普通QQ在线咨询接入   http://wpa.qq.com/msgrd?v=3&uin=4009603616&site=qq&menu=yes;   企业QQ在线咨询接入   ...

  9. python中format所有用法

    平时只用参数匹配,偶尔看到别人的format用法楞住没反应过来,遂记下 #通过位置 print '{0},{1}'.format('hehe',20) print '{},{}'.format('he ...

  10. springboot中使用filter

    通过注解的方式实现filter过滤器. 创建Filter包,并在该包下创建MyFilter 示例代码: package com.bjpowernode.springboot.filter; impor ...