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;
}


【打CF,学算法——四星级】CodeForces 689D Friends and Subsequences (RMQ+二分)

题目链接:CF 689D 题面: D. Friends and Subsequences time limit per test 2 seconds memory limit per...
  • David_Jett
  • David_Jett
  • 2016年07月08日 13:40
  • 786

RMQ--ST表算法理解

RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j ST算法(Sparse Tabl...
  • qq1169091731
  • qq1169091731
  • 2016年07月21日 11:59
  • 1091

BZOJ 1047 [HAOI2007]理想的正方形 二维ST表+压维

Description   有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小。 Input   第一行为3个整数,分别表示a,b,...
  • ThinFatty
  • ThinFatty
  • 2017年07月02日 22:28
  • 309

GCD (ST表,二分求区间查询)

HUD 5726 GCD    给一个序列,多次查询区间的最大公约数,并求出同样是这个最大公约数的区间有多少个。 区间查询采用ST表,第二问查询利用区间向右延伸最大公约数递减的规律可通过二分快速找到右...
  • yhn19951008
  • yhn19951008
  • 2016年07月22日 20:30
  • 280

[BZOJ3277]串(后缀数组+二分+st表)

题目描述传送门题解orz hxy sam随便艹 不过我感觉这道题用sa的做法非常厉害吖 由于每一个子串一定是某一个后缀的前缀,所以可以对于每一个后缀求其对答案能贡献多少个子串,也就是这个后缀有多少...
  • Clove_unique
  • Clove_unique
  • 2016年12月27日 18:59
  • 461

2016夏季练习——ST表+二分

ST表
  • kissacm
  • kissacm
  • 2016年07月21日 00:37
  • 98

【BZOJ3956】Count,单调栈+ST表维护区间最大值

星夜微光
  • xym_CSDN
  • xym_CSDN
  • 2016年08月11日 00:29
  • 227

ST(稀疏表)算法

一、ST算法(Sparse Table): ST(Sparse Table,稀疏表)算法是求解RMQ问题的经典在线算法,以O(nlogn)时间预处理,然后在O(1)时间内回答每个查询。ST算法本质上...
  • weeever
  • weeever
  • 2015年10月04日 13:03
  • 522

二分查找—有序顺序表

顺序表应用6:有序顺序表查询 Time Limit: 7MS Memory Limit: 700KBProblem Description 顺序表内按照由小到大的次序存放着n个互不相同的整数(1...
  • BlessingXRY
  • BlessingXRY
  • 2017年01月21日 11:33
  • 169

三大查找算法总结:二分查找,分块查找和哈希表查找。

终于下定决心把查找和排序好好整一整,今天就弄了一个对分查找,也成为对半查找。原理十分简单,话不多说,直接上源代码。未完待续,持续更新中。。。 1、对半查找,要求输入有序序列。 // sort.cp...
  • XIAXIA__
  • XIAXIA__
  • 2013年06月22日 22:06
  • 2563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces689D Friends and Subsequences 二分+ST表
举报原因:
原因补充:

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