【2019.11.11】

购物

二分 考场上想到了来着 被后面搜索劝退

ll cnt,b[N<<1];
bool check(ll mid){
	cnt=b[b[0]=1]=0;
	for(int i=1;i<=n;++i) {
		while(b[0]&&b[b[0]]+a[i]>mid) --b[0];
		if(!b[0]) return 0;
		for(int j=1;j<=b[0];++j) b[j+b[0]]=a[i]+b[j],++cnt;b[0]<<=1;
		if(cnt>=K) return 1;
		sort(b+1,b+b[0]+1);
	}
	return 0;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n),rd(K);
	for(int i=1;i<=n;++i) rd(a[i]),sum+=a[i];
	sort(a+1,a+1+n);
	ll l=1,r=sum,ans,mid;
	while(l<=r){
		mid=l+r>>1;
		if(check(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	printf("%lld",ans);
	return 0;
}

收益

不想打

排列交换

嘤 记得考试到最后啥都想不出来了就把暴力覆盖全部数据范围 万一还能过几个点呢QAQ 知道万一后面数据水的话能多水点分可是我就是没有加上去QAQ

void pup(int o){t[o]=Min(t[ls],t[rs]);}
int query(int o,int l,int r,int x,int y){
	//if(l>y||r<x) return inf;
	if(x<=l&&r<=y) return t[o];
	int mid=l+r>>1;
	if(y<=mid) return query(ls,l,mid,x,y);
	if(x>mid) return query(rs,mid+1,r,x,y);
	return min(query(ls,l,mid,x,y),query(rs,mid+1,r,x,y));
}
void upd(int o,int l,int r,int x,int k){
	if(l==r){t[o]=k;return;}
	int mid=l+r>>1;
	if(x<=mid) upd(ls,l,mid,x,k);
	else upd(rs,mid+1,r,x,k);
	pup(o);
}

priority_queue<int>q;vector<int>e[N];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
	rd(n),rd(K);
	for(int i=1;i<=n;++i) rd(a[i]),b[a[i]]=i;
	memset(t,inf,sizeof(t));
	for(int i=n,x,k;i;--i){
		k=b[i],x=query(1,1,n,k-K+1,k);
		if(x<=n) e[b[x]].push_back(k),++in[k];
		x=query(1,1,n,k,k+K-1);
		if(x<=n) e[b[x]].push_back(k),++in[k];
		upd(1,1,n,k,i);
	}
	for(int i=1;i<=n;++i) if(!in[i]) q.push(i);
	for(int i=n,u;i;--i){
		a[i]=u=q.top(),q.pop();
		for(int i=0,v,sz=e[u].size();i<sz;++i) if(!--in[v=e[u][i]]) q.push(v);
	}
	for(int i=1;i<=n;i++) b[a[i]]=i; 
	for(int i=1;i<=n;++i) printf("%d\n",b[i]);
	return 0;
}

85昏

	void work(){
		for(int i=1;i<=n;++i) b[a[i]]=i;a[0]=b[0]=0,a[n+1]=b[n+1]=n+1;
		bool use=1;
		while(use){
			use=0;
			for(int i=1,nw,pre,nxt;i<=n;++i){
				nw=a[i],pre=nw-1,nxt=nw+1;
				if(b[pre]-b[nw]>=K) a[b[pre]]=nw,a[b[nw]]=pre,swap(b[pre],b[nw]),use=1;
				if(b[nw]-b[nxt]>=K) a[b[nxt]]=nw,a[b[nw]]=nxt,swap(b[nxt],b[nw]),use=1;
			}
		}
		for(int i=1;i<=n;++i) printf("%d\n",a[i]);
		exit(0);
	}
int main(){
//	freopen("swap.in","r",stdin);
//	freopen("swap.out","w",stdout);
	rd(n),rd(K);
	for(int i=1;i<=n;++i) rd(a[i]);
	if(K==1){for(int i=1;i<=n;++i) printf("%d\n",i);return 0;}
	if(K==n-1){
		if(a[1]>a[n]) swap(a[1],a[n]);
		for(int i=1;i<=n;++i) printf("%d\n",a[i]);return 0;
	}
	work();
	return 0;
}
posted @ 2019-11-11 20:20  委屈的咸鱼鱼鱼鱼  阅读(108)  评论(0编辑  收藏  举报