社区讨论

关于此题分块写法

P2880[USACO07JAN] Balanced Lineup G参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@loy43s9j
此快照首次捕获于
2023/11/14 17:09
2 年前
此快照最后确认于
2023/11/14 18:49
2 年前
查看原帖
如果这道题还有区间修改,分块是不是这么写
CPP
#include<bits/stdc++.h>//区间修改+区间查询最值 
using namespace std;
#define re register
const int N=5e4+10,K=250,INF=0x3f3f3f3f;
struct node{
	int l,r;
	int maxx,minn;
	int lazy;
}kuai[K];
int n,q,cnt,len,a[N],cop[N],loc[N];
inline int read(){
	int f=0,fu=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')fu=-1;c=getchar();}
	while(c>='0'&&c<='9'){f=(f<<3)+(f<<1)+c-48;c=getchar();}
	return f*fu;
}
inline void write(int x){
	if(x<0)x=(x^-1)+1,putchar('-');
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
inline void reset(int x){
	for(re int i=kuai[x].l;i<=kuai[x].r;i=-~i){
		a[i]+=kuai[x].lazy;
		cop[i]=a[i];
	}
	kuai[x].lazy=0;
	stable_sort(cop+kuai[x].l,cop+kuai[x].r+1);
	kuai[x].maxx=cop[kuai[x].r];
	kuai[x].minn=cop[kuai[x].l];	
}
inline void update(int l,int r,int k){
	int st=loc[l],en=loc[r];
	for(re int i=l;i<=min(r,kuai[st].r);i=-~i)a[i]+=k;
	reset(st);
	if(st!=en){
		for(re int i=kuai[en].l;i<=r;i=-~i)a[i]+=k;
		reset(en);
		for(re int i=st+1;i<en;i=-~i)kuai[i].lazy+=k;
	}
}
inline int query(int l,int r){
	int st=loc[l],en=loc[r],maxx=-INF,minn=INF;
	for(re int i=l;i<=min(r,kuai[st].r);i=-~i){
		maxx=max(maxx,a[i]+kuai[st].lazy);
		minn=min(minn,a[i]+kuai[st].lazy);
	}
	if(st!=en){
		for(re int i=kuai[en].l;i<=r;i=-~i){
			maxx=max(maxx,a[i]+kuai[en].lazy);
			minn=min(minn,a[i]+kuai[en].lazy);
		}
		for(re int i=st+1;i<en;i=-~i){
			maxx=max(maxx,kuai[i].maxx);
			minn=min(minn,kuai[i].minn);
		}
	}
	return maxx-minn;
}
int main(){
	n=read(),q=read();len=sqrt(n);
	for(re int i=1;i<=n;i=-~i){
		a[i]=read();
		if(i%len==1){
			kuai[++cnt].l=i;
			kuai[cnt].minn=INF;
			kuai[cnt].maxx=-INF;	
		}
		loc[i]=cnt;
		kuai[cnt].r=i;
		kuai[cnt].maxx=max(kuai[cnt].maxx,a[i]);
		kuai[cnt].minn=min(a[i],kuai[cnt].minn);
		cop[i]=a[i];
	}
	for(re int i=1;i<=cnt;i=-~i)reset(i);		int l,r,k,op;
	while(q--){
		op=read(),l=read(),r=read(),k=read();
		if(op==1)update(l,r,k);
		else write(query(l,r)),puts("");
	}
	return 0;
}//板子

回复

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

正在加载回复...