社区讨论

D,Wa4个点,求调,玄关

学术版参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj02sn6
此快照首次捕获于
2025/11/03 18:31
4 个月前
此快照最后确认于
2025/11/03 18:31
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,op;
ll m,a[3145140],s[3145140],b[3145140];
ll ans,c,cnt,res;

ll js(){
	int l=op,r=cnt+cnt+cnt,mid=0;
	while(1){
		if(mid==(l+r)/2)
		  break;
		mid=(l+r)/2;
		if(s[mid]-s[op]>=c)
		  r=mid;
		else
		  l=mid+1;
	}
	mid=max(mid-51,op);//cout<<mid<<' ';
	while(mid++)
	  if(s[mid]-s[op]>=c&&s[mid-1]-s[op]<c)
		  break;
		  
	//cout<<op<<' '<<mid<<' '<<s[mid]-s[op]<<'\n';
	return s[mid]-s[op];	  
}

int main(){
	
	cin>>n>>m>>c;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]++;
	}
	//a[++n]=1;
	a[++n]=m;
	sort(a+1,a+1+n);
  a[0]=0;
  if(a[1]!=1)
    b[++cnt]=0;
	for(int i=1;i<=n;i++){
		if(a[i-1]!=a[i])
		  b[++cnt]++;
		else
		  b[cnt]++;  
	}
	//if(a[n]!=m){
	//	a[++n]=m;
	//	b[++cnt]=0;
	//}
	//b[1]--;
	b[cnt]--;
	
	for(int i=1;i<=cnt+cnt;i++)
		b[i+cnt]=b[i];
	for(int i=1;i<=cnt+cnt+cnt;i++)
	  s[i]=s[i-1]+b[i];	
	//cout<<s[1]<<' '<<s[2]<<' ';
	//for(int i=1;i<=cnt+cnt;i++)
	//  cout<<i<<' '<<b[i]<<" "<<s[i]<<'\n';
	
	for(int i=1;i<=n;i++){
		if(a[i]!=a[i-1]){
			op++;
			//cout<<js()<<' '<<a[i]-a[i-1]<<'\n';
			ans+=(a[i]-a[i-1])*js();
		//	cout<<ans<<'\n';
		}
	} //cout<<js()<<'\n';
//	op++;
//	ans+=(m-a[n])*js();
//	cout<<m-a[n]<<' ';
	cout<<ans; 
	
	return 0;
}
/*
5 4 2
1 1 1 2 2
*/

回复

4 条回复,欢迎继续交流。

正在加载回复...