求调,玄关
查看原帖
求调,玄关
555617
Targanzqq楼主2024/9/11 19:16

rt

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

int n,m,a[500005],pre[500005],nxt[500005][25],ans;
map<int,int> mp;

int check(int x){
	mp.clear();
	for(int i=1;i<=2*n;i++){
		pre[i]=pre[i-1]+a[i];
		mp[pre[i]]=i;
	}
	for(int i=1;i<=2*n;i++){
		int k=mp.lower_bound(pre[i]+x)->second;
		if(k>i)nxt[i][0]=k;
		else nxt[i][0]=2*n;
	}
	for(int j=1;j<=20;j++){
		for(int i=1;i<=2*n;i++){
			nxt[i][j]=nxt[nxt[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=n;i++){
		for(int k=20,j=i,cnt=0;;k--){
			if(j>=i+n&&cnt>=m)return 1;
			else if(j>=i+n)break;
			if(nxt[j][k]==0||nxt[j][k]>i+n)continue;
			j=nxt[j][k];cnt+=(1<<k);
		}
	}
	return 0;
}

signed main(){
	//ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
    	a[i+n]=a[i];
	}
	int l=1,r=1145141919810ll;
	while(1){
		if(l>r)break;
		int mid=(l+r)/2;
		if(check(mid))l=mid+1;
		else r=mid-1;
	}
	cout<<l<<" ";
	for(int i=1;i<=n;i++){
		for(int k=20,j=i,cnt=0;;k--){
			if(j>=i+n&&cnt>=m)ans++;
			if(j>=i+n)break;
			if(nxt[j][k]==0)continue;
			j=nxt[j][k];cnt+=(1<<k);
		}
	}
	cout<<n-ans;
}
2024/9/11 19:16
加载中...