救命啊(回复必关)
查看原帖
救命啊(回复必关)
305735
Jean_Gunnhildr楼主2024/8/30 21:19
#include<bits/stdc++.h>
using namespace std;
int n;
long long k;
long long a[2000005],c1[2000005],c2[2000005],times[2000005];
long long lowbit(long long x){
	return x&(-x);
}
void add(int id,int num,long long c[]){
	if(id<=0) return ;
	for(int i=id;i<=n;i+=lowbit(i)) c[i]+=num;
	return ;
}
long long ask(int pos,long long c[]){
	if(pos<=0) return 0;
	long long ans=0;
	for(int i=pos;i>=1;i-=lowbit(i)) ans+=c[i];
	return ans;
}

int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	long long ans=1145141919810,l=1,r=0,temp=0,cnt=0;
	while(r<n){
		if(temp<k){
			r++;
			if(times[a[r]]!=0){
				temp-=(ask(times[a[r]]-1,c1)+(cnt-1-ask(times[a[r]]-1,c2))*times[a[r]]);
				add(times[a[r]],-times[a[r]],c1);
				add(times[a[r]],-1,c2);
			}
			if(times[a[r]]==0) cnt++;
			times[a[r]]++;
			add(times[a[r]],times[a[r]],c1);
			add(times[a[r]],1,c2);
			temp+=(ask(times[a[r]]-1,c1)+(cnt-1-ask(times[a[r]]-1,c2))*times[a[r]]);
		}
		while(temp>=k){
			ans=min(ans,r-l+1);
			l++;
			temp-=(ask(times[a[l-1]]-1,c1)+(cnt-1-ask(times[a[l-1]]-1,c2))*times[a[l-1]]);
			add(times[a[l-1]],-times[a[l-1]],c1);
			add(times[a[l-1]],-1,c2);
			if(times[a[l-1]]==0) cnt--;
			else{
				add(times[a[l-1]],times[a[l-1]],c1);
				add(times[a[l-1]],1,c2);
				temp+=(ask(times[a[l-1]]-1,c1)+(cnt-1-ask(times[a[l-1]]-1,c2))*times[a[l-1]]);
			}
		}
	}
	if(temp>=k) ans=min(ans,r-l+1);
	if(ans==1145141919810) cout<<-1;
	else cout<<ans;
	return 0;
}

几乎要和标程一样了

2024/8/30 21:19
加载中...