CF D2求调
  • 板块学术版
  • 楼主heaksicn杠J歪
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/5/13 00:38
  • 上次更新2023/10/23 15:58:30
查看原帖
CF D2求调
343251
heaksicn杠J歪楼主2023/5/13 00:38

最后 re on test15。

//Man always remember love because of romance only!
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline void write(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int a[500001];
int tr[1000001],tag[1000001];
int n,q;
void pushup(int x){
	tr[x]=min(tr[x<<1],tr[x<<1|1]);
} 
void pushdown(int x,int l,int r){
	if(tag[x]){
		int mid=(l+r)/2;
		tag[x<<1]+=tag[x];
		tag[x<<1|1]+=tag[x];
		tr[x<<1]+=tag[x];
		tr[x<<1|1]+=tag[x];
		tag[x]=0; 
	}
}
void build(int x,int l,int r){
	if(l==r){
		tr[x]=a[l]+(n-l+1);
		return;
	}
	int mid=(l+r)/2;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}
void update(int x,int k,int l,int r,int nl,int nr){
	if(nl<=l&&nr>=r){
		tr[x]+=k;
		tag[x]+=k;
		return;
	}
	pushdown(x,l,r);
	int mid=(l+r)/2;
	if(mid>=nl) update(x<<1,k,l,mid,nl,nr);
	if(mid<nr) update(x<<1|1,k,mid+1,r,nl,nr);
	pushup(x);
}
int query(int x,int l,int r,int nl,int nr){
	if(nl<=l&&nr>=r) return tr[x];
	int res=2e9;
	int mid=(l+r)/2;
	pushdown(x,l,r);
	if(mid>=nl) res=min(res,query(x<<1,l,mid,nl,nr));
	if(mid<nr) res=min(res,query(x<<1|1,mid+1,r,nl,nr));
	return res;
}
int minn[1000010][5];
signed main(){
	n=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	sort(a+1,a+n+1);
	build(1,1,n);
	minn[0][0]=minn[n+1][1]=2e9;
	for(int i=1;i<=n;i++) minn[i][0]=min(minn[i-1][0],a[i]);
	for(int i=n;i;i--) minn[i][1]=min(minn[i+1][1],a[i]);
	int minn1=2e9;
	for(int i=1;i<n;i++) minn1=min(minn1,a[i]-i+1);
	int sum1=0;
	for(int i=1;i<n;i++) sum1+=(a[i]-(minn1+i-1));
	int minn2=2e9;
	for(int i=1;i<=n;i++) minn2=min(minn2,a[i]-i+1);
	int sum2=0;
	for(int i=1;i<=n;i++) sum2+=(a[i]-(minn2+i-1));
	while(q--){
		int k=read();
		if(k<=n){
			int tp=query(1,1,n,1,1);
			update(1,a[1]+k-tp,1,n,1,n);
			int res=minn[k+1][1];
			res=min(res,query(1,1,n,1,k));
			write(res);
			printf(" ");
		}else{
			if((k-n)%2!=0){
				int res;
				if((k-n+1)/2<=sum1) res=min(minn1+k,a[n]);
				else{
					int sb=k;
					k=(k-n+1)/2;
					k-=sum1;
					int le=k/(n-1);
					if(k%(n-1)!=0) le++;
					res=min(minn1-le+sb,a[n]);
				}
				write(res);
				printf(" ");
			}else{
				int res;
				if((k-n)/2<=sum2) res=minn2+k;
				else{
					int sb=k;
					k=(k-n)/2;
					k-=sum2;
					int le=k/n;
					if(k%n!=0) le++;
					res=minn2-le+sb;
				}
				write(res);
				printf(" ");
			}
		}
	}
	return 0;
}

2023/5/13 00:38
加载中...