Codeforces Round #361 (Div. 2) D. Friends and Subsequences 二分
2016-10-08 16:58
429 查看
题意
给你一个a数组和一个b数组问你有多少对(l,r)满足,a数组中max(L,R)恰好等于b数组中的min(L,R)
题解
暴力枚举L,然后二分相等的那个区间就好了。因为max肯定是递增的,min是递减的
那个相等的区间可以二分出来。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int n;
int a[maxn],b[maxn];
struct RMQ{
const static int RMQ_size = maxn;
int n;
int ArrayMax[RMQ_size][21];
int ArrayMin[RMQ_size][21];
void build_rmq(){
for(int j = 1 ; (1<<j) <= n ; ++ j)
for(int i = 0 ; i + (1<<j) - 1 < n ; ++ i){
ArrayMax[i][j]=max(ArrayMax[i][j-1],ArrayMax[i+(1<<(j-1))][j-1]);
ArrayMin[i][j]=min(ArrayMin[i][j-1],ArrayMin[i+(1<<(j-1))][j-1]);
}
}
int QueryMax(int L,int R){
int k = 0;
while( (1<<(k+1)) <= R-L+1) k ++ ;
return max(ArrayMax[L][k],ArrayMax[R-(1<<k)+1][k]);
}
int QueryMin(int L,int R){
int k = 0;
while( (1<<(k+1)) <= R-L+1) k ++ ;
return min(ArrayMin[L][k],ArrayMin[R-(1<<k)+1][k]);
}
void init(int * a,int sz){
n = sz ;
for(int i = 0 ; i < n ; ++ i) ArrayMax[i][0] = ArrayMin[i][0] = a[i];
build_rmq();
}
}s1,s2;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)scanf("%d",&b[i]);
a
=2e9;
b
=-2e9;
s1.init(a,n+1);
s2.init(b,n+1);
long long ans = 0;
for(int i=0;i<n;i++){
if(a[i]>b[i])continue;
int l=i,r=n,ansl=i;
while(l<=r){
int mid=(l+r)/2;
if(s1.QueryMax(i,mid)>=s2.QueryMin(i,mid))r=mid-1,ansl=mid;
else l=mid+1;
}
if(s1.QueryMax(i,ansl)>s2.QueryMin(i,ansl))continue;
l=i,r=n;
int ansr=i;
while(l<=r){
int mid=(l+r)/2;
if(s1.QueryMax(i,mid)>s2.QueryMin(i,mid))r=mid-1,ansr=mid;
else l=mid+1;
}
ans+=ansr-ansl;
}
cout<<ans<<endl;
}
相关文章推荐
- Codeforces Round #361 (Div. 2) D. Friends and Subsequences 二分
- Codeforces Round #361 (Div. 2) D. Friends and Subsequences (二分+RMQ)
- ST表与二分 (CodeForces 689D-Friends and Subsequences)
- [Codeforces 689D] Friends and Subsequences (二分+稀疏表)
- Codeforces Round #275 (Div. 2) B. Friends and Presents 二分+数学
- Codeforces Round #361 (Div. 2) D. Friends and Subsequences
- [CF689D] Friends and Subsequences(RMQ, 二分)
- [Codeforces #275 (Div. 2)B. Friends and Presents] 二分
- codeforces Round #361 D. Friends and Subsequences (ST表,二分)
- Codeforces 689D -Friends and Subsequences (RMQ查询-> ST表+二分)
- codeforces 689D D. Friends and Subsequences(RMQ+二分)
- CF689D:Friends and Subsequences(ST表 + 二分)
- Friends and Subsequences(RMQ+二分||双端队列)
- Codeforces Round #361 (Div. 2)D. Friends and Subsequences
- Codeforces-689 D Friends and Subsequences(RMQ+二分)
- Codeforces #275 (Div. 2) B - Friends and Presents(二分大法好)
- Codeforces Round #361 (Div. 2) D Friends and Subsequences
- VK Cup 2016 - Round 1 (Div. 2 Edition) B. Bear and Displayed Friends 树状数组
- Codeforces Round #365 (Div. 2) C. Chris and Road(计算几何+二分)
- 【VK Cup 2016 - Round 1 (Div 2 Edition)B】【水题】Bear and Displayed Friends 即时维护最大6个数