萌新求助二分+ST表
  • 板块灌水区
  • 楼主Infinite_Energy
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/15 18:23
  • 上次更新2023/11/3 03:34:40
查看原帖
萌新求助二分+ST表
561529
Infinite_Energy楼主2023/8/15 18:23

CF359D

#include<bits/stdc++.h>
using namespace std;
int n,a[1000010],f[1000010][20],g[1000010][20],l,r,mid,len,cnt,lg[1000010],ans[1000010];
long long gcd(long long x,long long y){
	if(y==0){
		return x;
	}
	return gcd(y,x%y);
}
long long ansmin(long long x,long long y){
	long long len=lg[y-x+1];
	return min(f[x][len],f[y-(1<<len)+1][len]);
}
long long ansgcd(long long x,long long y){
	long long len=lg[y-x+1];
	return gcd(f[x][len],f[y-(1<<len)+1][len]);
}
bool check(long long len){
	for(int l=1;l+len<=n;l++){
		int r=l+len;
		if(ansgcd(l,r)==ansmin(l,r)){
			return true;
		}
	}
	return false;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i][0]=a[i];
		g[i][0]=a[i];
	}
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
			g[i][j]=gcd(g[i][j-1],g[i+(1<<(j-1))][j-1]);
		}
	}
	for(int i=2;i<=n;i++){
		lg[i]=lg[i/2]+1;
	}
	l=0;
	r=n-1;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			len=mid;
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	for(int l=1;l+len<=n;l++){
		int r=l+len;
		if(ansgcd(l,r)==ansmin(l,r)){
			cnt++;
			ans[cnt]=l;
		}
	}
	cout<<cnt<<" "<<len<<endl;
	for(int i=1;i<=cnt;i++){
		cout<<ans[i]<<" ";
	}
	return 0;
}
2023/8/15 18:23
加载中...