这是线段树,为什么9个点RE 1个点WA
查看原帖
这是线段树,为什么9个点RE 1个点WA
320470
William_Takazaki楼主2023/7/20 10:32
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int tr[N*4],add[N*4],a[N],n,m;
void pushup(int k){
	tr[k]=min(tr[k*2],tr[k*2+1]);
}void build(int k,int l,int r){
	if(l==r){
		tr[k]=a[l];
		return;
	}int mid=l+r>>1;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	pushup(k);
}void change(int k,int l,int r,int v){
	tr[k]+=v;
	add[k]+=v;
}void pushdown(int k,int l,int r){
	if(add[k]!=0){
		int mid=l+r>>1;
		change(k*2,l,mid,add[k]);
		change(k*2+1,mid+1,r,add[k]);
		add[k]=0;
	}
}int query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return tr[k];
	pushdown(k,l,r);
	int mid=l+r>>1,minn=INT_MAX;
	if(x<=mid)minn=min(minn,query(k*2,l,mid,x,y));
	if(y>mid)minn=min(minn,query(k*2+1,mid+1,r,x,y));
	return minn;
}int main(){
	int i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	for(i=1;i<=n;i++){
		if(i==1)printf("0\n");
		else if(i==2)printf("%d\n",a[1]);
		else{
			int x=i-m,y=i-m+1;
			printf("%d\n",query(1,1,n,x,y));
		}
	}
	return 0;
}

我也寻思着这也没问题啊QAQ

2023/7/20 10:32
加载中...