codeforces689D Friends and Subsequences 二分+ST表

原创 2016年08月28日 18:37:23

codeforces689D

二分+ST表的经典搞法,和HDOJ 5726 GCD是一模一样的想法

贴个题解:HDOJ 5726 gcd


两次二分的问题

第一次二分,找到右端点的左值(如果有的话)

如果有,那么进行第二次二分,找到右端点的右值,那么对应该左端点,答案的增长是右端点的区间长度

如果没有,那么说明对应该左端点,没有符合条件的右端点


代码如下:

#include<bits/stdc++.h>
using namespace std;

const int maxn=2e5+50;
int ma[maxn][30],mi[maxn][30],n;
__int64 ans;

void init(){
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i+(1<<j)-1<=n;i++){
			ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
			mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
		}
}

int getMax(int L,int R){
	int K=(int)log2(double(1.0*(R-L+1)));
	return max(ma[L][K],ma[R+1-(1<<K)][K]);
}

int getMin(int L,int R){
	int K=(int)log2(double(1.0*(R-L+1)));
	return min(mi[L][K],mi[R+1-(1<<K)][K]);
}

int main(){
	//freopen("input.txt","r",stdin);
	while(scanf("%d",&n)!=EOF){
		ans=0;
		for(int i=1;i<=n;i++) scanf("%d",&ma[i][0]);
		for(int i=1;i<=n;i++) scanf("%d",&mi[i][0]);
		init();
		for(int i=1;i<=n;i++){
			int L=i,R=n,mid,R1=-1,R2=-1;
			while(L<=R){
				mid=(L+R)>>1;
				if (getMax(i,mid)==getMin(i,mid)) R1=mid;
				if (getMax(i,mid)>=getMin(i,mid)) R=mid-1;
				else L=mid+1;
			}
			if (R1==-1) continue;
			L=i;R=n;
			while(L<=R){
				mid=(L+R)>>1;
				if (getMax(i,mid)>getMin(i,mid)) R=mid-1;
				else L=mid+1,R2=mid;
			}
			ans+=R2-R1+1; 
		}
		printf("%I64d\n",ans);
	}
	return 0;
}


相关文章推荐

Codeforces 689D Friends and Subsequences【思维+二分+RMQ】套路题

D. Friends and Subsequences time limit per test 2 seconds memory limit per test 512 megabyte...

Codeforces 689D Friends and Subsequences (RMQ+二分)

题意求有多少对区间满足其中一个区间的最大值等于另一个区间的最小值。思路首先RMQ预处理出所有区间的最大值和最小值(线段树会超时。。。) 然后因为我们固定这两个区间的左端点枚举区间的右端点,因为右端点...

codeforces Round #361 D. Friends and Subsequences (ST表,二分)

D. Friends and Subsequences Mike and !Mike are old childhood rivals, they are opposite in everythi...
  • lov_vol
  • lov_vol
  • 2016年07月07日 21:39
  • 447

【22.48%】【codeforces 689D】Friends and Subsequences

time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandar...

CodeForces 689D-Friends and Subsequences

题目 D. Friends and Subsequences time limit per test 2 seconds memory limit per test 512 megabyt...
  • Druning
  • Druning
  • 2016年07月07日 22:37
  • 237

Cf Round #361 (Div. 2) 689D. Friends and Subsequences

题意给两个长度相同的整型数组a[],b[], 找到所有的l到r,使得l到r内的 a_max 与 b_min相同,输出满足条件的组数。题解稀疏表+二分搜索 稀疏表: 用da[i][j] 表示 数组a从...

Codeforces Round #361 (Div. 2) D Friends and Subsequences

原题网址:http://codeforces.com/contest/689/problem/D对于每一个确定的l,随着r的增大,max ai 单调增,min bi 单调减,对于每一个l可以二分,对于...

Codeforces 689C Mike and Chocolate Thieves (二分)

Codeforces 689C Mike and Chocolate Thieves (二分)

Codeforces 689.C Mike and Chocolate Thieves 二分+数学

二分专题 二分+数学

Codeforces 689D RMQ+二分

题目链接 【题意】给定长度为n的两个序列,寻找区间l,r使得这段区间上的max(a[i]) = min (b[i]), 求满足条件的l,r数对的数量【分析】在固定l后,随着r的增加,max(a[i])...
  • d_vip
  • d_vip
  • 2017年07月13日 15:04
  • 56
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces689D Friends and Subsequences 二分+ST表
举报原因:
原因补充:

(最多只允许输入30个字)