分块0tps跑了几组数据都没问题,求大佬
  • 板块P2357 守墓人
  • 楼主xiaoql
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/11 11:21
  • 上次更新2024/3/11 11:41:47
查看原帖
分块0tps跑了几组数据都没问题,求大佬
114671
xiaoql楼主2024/3/11 11:21
//分块
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1000;
#define ll long long
ll n,f,a[N],len,s[5000],add[5000];
ll get(ll i){//获取当前在哪块
	return i/len;
}
void solove(ll x,ll y,ll d){
	if(get(x)==get(y)){//在同一块内
		for(ll i=x;i<=y;i++){
			a[i]+=d,s[get(i)]+=d;
		}
		return;
	}
	ll i=x,j=y;
	while(get(i)==get(x)){//左边不满的块暴力
		a[i]+=d;
		s[get(i)]+=d;
		i++;
	
	}
	while(get(j)==get(y)){//右边不满的块暴力
		a[j]+=d;
		s[get(j)]+=d;
		j--;
	}
	for(ll k=get(i);k<=get(j);k++){//完整的块
		s[k]+=len*d;
		add[k]+=d;//懒标记
	}
}
ll ask(ll x,ll y){
	ll res=0;
	if(get(x)==get(y)){
		for(ll i=x;i<=y;i++)
			res+=a[i]+add[get(i)];
		return res;
	}
	ll i=x,j=y;
	while(get(i)==get(x)){
		res+=a[i]+add[get(i)];
		i++;
	}
	while(get(j)==get(y)){
		res+=a[j]+add[get(j)];
		j--;
	}
	for(ll k=get(i);k<=get(j);k++){
		res+=s[k];
	}
	return res;
}
int main(){
	cin>>n>>f;
	for(ll i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	len=sqrt(n);//分块长度
	while(f--){
		ll op,x,y,k;
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			solove(x,y,k);
		}else if(op==2){
			scanf("%lld",&k);
			a[1]+=k;
			s[get(1)]+=k;
		}else if(op==3){
			scanf("%lld",&k);
			a[1]-=k;
			s[get(1)]-=k;
		}else if(op==4){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",ask(x,y));
		}else if(op==5){
			printf("%lld\n",a[1]+add[get(1)]);
		}
	}
}
2024/3/11 11:21
加载中...