求调||玄关
查看原帖
求调||玄关
555617
Targanzqq楼主2024/9/12 19:28
#include<bits/stdc++.h>
#define int long long
using namespace std;

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

int check(int x){
	for(int i=1;i<=2*n;i++){
		int k=mp.lower_bound(pre[i-1]+x)->second;
		if(pre[k]-pre[i-1]>=x)nxt[i][0]=k+1;
		else nxt[i][0]=0;
	}
	for(int j=1;j<=20;j++){
		for(int i=1;i<=2*n;i++){
			if(!nxt[i][j-1])nxt[i][j]=0;
			else nxt[i][j]=nxt[nxt[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=n;i++){
		for(int k=20,j=i;k>=0;k--){
			if(m&(1<<k))j=nxt[j][k];
			if(j&&k==0&&j<=i+n)return 1;
    	}
	}
	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];
	}
	for(int i=1;i<=2*n;i++){
		pre[i]=pre[i-1]+a[i];
		mp[pre[i]]=i;
	}
	int l=1,r=1145141919810ll,mid;
	while(1){
		if(l>r)break;
		mid=(l+r)/2;
		if(check(mid))l=mid+1;
		else r=mid-1;
	}
	cout<<mid<<" ";
    for(int i=1;i<=n;i++){
		for(int k=20,j=i;k>=0;k--){
			if(m&(1<<k))j=nxt[j][k];
			if(j&&k==0&&j<=i+n)ans++;
    	}
	}
	cout<<n-ans;
}
2024/9/12 19:28
加载中...