【22.48%】【codeforces 689D】Friends and Subsequences
time limit per test2 seconds
memory limit per test512 megabytes
inputstandard input
outputstandard output
Mike and !Mike are old childhood rivals, they are opposite in everything they do, except programming. Today they have a problem they cannot solve on their own, but together (with you) — who knows?
Every one of them has an integer sequences a and b of length n. Being given a query of the form of pair of integers (l, r), Mike can instantly tell the value of
while !Mike can instantly tell the value of
.
Now suppose a robot (you!) asks them all possible different queries of pairs of integers (l, r) (1 ≤ l ≤ r ≤ n) (so he will make exactly n(n + 1) / 2 queries) and counts how many times their answers coincide, thus for how many pairs
is satisfied.
How many occasions will the robot count?
Input
The first line contains only integer n (1 ≤ n ≤ 200 000).
The second line contains n integer numbers a1, a2, …, an ( - 109 ≤ ai ≤ 109) — the sequence a.
The third line contains n integer numbers b1, b2, …, bn ( - 109 ≤ bi ≤ 109) — the sequence b.
Output
Print the only integer number — the number of occasions the robot will count, thus for how many pairs
is satisfied.
Examples
input
6
1 2 3 2 1 4
6 7 1 2 3 2
output
2
input
3
3 3 3
1 1 1
output
0
Note
The occasions in the first sample case are:
1.l = 4,r = 4 since max{2} = min{2}.
2.l = 4,r = 5 since max{2, 1} = min{2, 3}.
There are no occasions in the second sample case since Mike will answer 3 to any query pair, but !Mike will always answer 1.
【题解】
用ST算法搞(也就是RMQ算法);
这可以搞定任意两个点之间的最大值和最小值。
接着顺序枚举起点i
对于每个起点i,二分枚举它的终点t;
①如果[i..t]这段区间内a的最大值大于b的最小值,则右端点再也不能往右了。因为再往右只会让这个差距越来越大,不能让他们相等。
②如果[i..t]这段区间内a的最大值等于b的最小值,则这是一个可行的右端点。
③如果[i..t]这段区间内a的最大值小于b的最小值,则右端点可以再往右,以逼近max==min(当然也可能不存在);
总之,枚举起点i,然后找到最靠左的满足要求的右端点t1,和最靠右的满足要求的右端点t2,答案对数增加t2-t1+1
这个t1和t2可以用两个二分写出来(分开写)
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 18;
const int MAXN = 209999;
const int INF = 2e9;
int dpmax[210000][MAX + 3],dpmin[210000][MAX + 3];
int pre2[MAX + 3];
int a[MAXN], b[MAXN];
int need[MAXN];
int n;
void input(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
int sign =1;
if (t == '-') sign = -sign;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input(n);
for (int i = 1; i <= n; i++)
input(a[i]), dpmax[i][0] = a[i];
for (int i = 1; i <= n; i++)
input(b[i]), dpmin[i][0] = b[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= 18; j++)
dpmin[i][j] = INF,dpmax[i][j]=-INF;
pre2[0] = 1;
for (int i = 1; i <= 18; i++)
pre2[i] = pre2[i - 1] << 1;
need[1] = 0; need[2] = 1;
int temp = 2;
for (int i = 3; i <= n; i++)//need[i]表示长度为i是2的多少次方,可以理解为[log2i]
if (pre2[temp] == i)
need[i] = need[i - 1] + 1, temp++;
else
need[i] = need[i - 1];
for (int l = 1; pre2[l] <= n; l++)//利用st算法搞出区间最大和最小值
for (int i = 1;i <= n;i++)
if (i + pre2[l] - 1 <= n)
dpmax[i][l] = max(dpmax[i][l - 1], dpmax[i + pre2[l - 1]][l - 1]);
for (int l = 1; pre2[l] <= n; l++)
for (int i = 1; i <= n; i++)
if (i + pre2[l] - 1 <= n)
dpmin[i][l] = min(dpmin[i][l - 1], dpmin[i + pre2[l - 1]][l - 1]);
long long ans = 0;
for (int i = 1; i <= n; i++){
int l = i, r = n;
//找最左边的
int numl = -1;
while (l <= r){
int m = (l + r) >> 1;
int len = need[m-i+1];
int themax = max(dpmax[i][len], dpmax[m - pre2[len] + 1][len]);
int themin = min(dpmin[i][len], dpmin[m - pre2[len] + 1][len]);
if (themax > themin)
r = m-1;
else
if (themax == themin){
numl = m;
r = m - 1;
}
else
if (themax < themin)
l = m + 1;
}
//找最右边的
int numr = -1;
l = i, r = n;
while (l <= r) {
int m = (l + r) >> 1;
int len = need[m - i + 1];
int themax = max(dpmax[i][len], dpmax[m - pre2[len] + 1][len]);
int themin = min(dpmin[i][len], dpmin[m - pre2[len] + 1][len]);
if (themax > themin)
r = m - 1;
else
if (themax == themin) {
numr = m;
l = m + 1;
}
else
if (themax < themin)
l = m + 1;
}
if (numl != -1)
ans += (numr - numl + 1);
}
printf("%I64d\n", ans);
return 0;
}
【22.48%】【codeforces 689D】Friends and Subsequences的更多相关文章
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- codeforces 689D D. Friends and Subsequences(RMQ+二分)
题目链接: D. Friends and Subsequences time limit per test 2 seconds memory limit per test 512 megabytes ...
- 【32.22%】【codeforces 602B】Approximating a Constant Range
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【22.70%】【codeforces 591C】 Median Smoothing
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【22.73%】【codeforces 606D】Lazy Student
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 766E】Mahmoud and a xor trip
[题目链接]:http://codeforces.com/contest/766/problem/E [题意] 定义树上任意两点之间的距离为这条简单路径上经过的点; 那些点上的权值的所有异或; 求任意 ...
- 【codeforces 733F】Drivers Dissatisfaction
[题目链接]:http://codeforces.com/problemset/problem/733/F [题意] 给你n个点m条边; 让你从中选出n-1条边; 形成一个生成树; (即让n个点都联通 ...
- 【codeforces 799D】Field expansion
[题目链接]:http://codeforces.com/contest/799/problem/D [题意] 给你长方形的两条边h,w; 你每次可以从n个数字中选出一个数字x; 然后把h或w乘上x; ...
- 【codeforces 22C】 System Administrator
[题目链接]:http://codeforces.com/problemset/problem/22/C [题意] 给你n个点; 要求你构造一个含m条边的无向图; 使得任意两点之间都联通; 同时,要求 ...
随机推荐
- 常用的织梦dedecms安全设置集合整理
织梦系统用户很多,被发现的漏洞也就相对很多,所以网站安全需要做好,很多所谓的“黑客”都是用工具来扫描入侵,厉害点的人是不屑来黑我们的小网站的,所以在我们不是专业维护人员情况下,做好一般的安全防护就可以 ...
- 【习题 3-5 UVA-227】Puzzle
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟题.. 输入稍微恶心了点. getchar()一个一个搞就好. [代码] #include <bits/stdc++.h& ...
- Oracle以系统管理员的方式登录失败
解决方法: 因为SYS是在数据库之外的超级管理员,所以我们在登录的时候输入sys后在输入命令:password as sysdba 就可以!例如:输入口令: m1234 as sysdba 参考文章 ...
- POJ 1952 BUY LOW, BUY LOWER DP记录数据
最长递减子序列.加记录有多少个最长递减子序列.然后须要去重. 最麻烦的就是去重了. 主要的思路就是:全面出现反复的值,然后还是同样长度的子序列.这里的DP记录的子序列是以当前值为结尾的时候,而且一定选 ...
- js json简介(json的本质也是字符串)(用于服务器和客户端通信)
js json简介(json的本质也是字符串)(用于服务器和客户端通信) 一.总结 1.json的语法和js的语法非常像,只是json的键和值都是双引号,因为json的本质也是字符串 2.json是一 ...
- 【u230】回文词
Time Limit: 1 second Memory Limit: 128 MB [问题描述] CR喜欢研究回文词,有天他发现一篇文章,里面有很多回文数,这使他来了兴趣.他决定找出所有长度在n个字节 ...
- 23种设计模式——Prototype模式
Prototype模式是提供自我复制的功能.包括浅拷贝和深拷贝. 一.Prototype模式的用途 场景1:游戏场景中有很多类似的敌人,它们的技能都一样,但是随着敌人出现的位置和不同,它们的能力也不太 ...
- [D3] Convert Input Data to Output Values with Linear Scales in D3
Mapping abstract values to visual representations is what data visualization is all about, and that’ ...
- Android 为开发者准备的最佳 Android 函数库(2016 年版)
本文是翻译自 CloudRAIL 的官方博客(https://cloudrail.com/best-android-libraries-for-developers/),本文中分享的 Android ...
- docker nginx实现一个主机部署多个站点
原文:docker nginx实现一个主机部署多个站点 在某站租赁的虚拟机快到期了,续费得花200多,想到在阿里云新买的服务器,不如把这个也转移过去.域名我就用真实的吧,大家别黑我网站就好了,谢谢各位 ...