分块求调
查看原帖
分块求调
936616
zibenlun楼主2024/9/29 08:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct nd{
	int sz,flag_sum,flag_fan,maxx=-1e18;
	vector<int> v;
}start;
int n,m,len;
vector<nd> c;
void reset(int pos){
	c[pos].maxx=-1e18;
	for(int i=0;i<c[pos].sz;i++){
		c[pos].v[i]+=c[pos].flag_sum;
		c[pos].maxx=max(c[pos].maxx,c[pos].v[i]);
	}
	c[pos].flag_sum=0;
	if(c[pos].flag_fan){
		c[pos].flag_fan=0;
		for(int i=0,j=c[pos].sz-1;i<j;i++,j--){
			swap(c[pos].v[i],c[pos].v[j]);
		}
	}
}
void Reset(){
	vector<int> v;
	for(int i=0;i<c.size();i++){
		reset(i);
		for(int j=0;j<c[i].sz;j++){
			v.push_back(c[i].v[j]);
		}
	}
	vector<nd> zibenlun;
	swap(zibenlun,c);
	c.push_back(start);
	for(auto x:v){
		if(c[c.size()-1].sz>=len) c.push_back(start);
		c[c.size()-1].maxx=max(c[c.size()-1].maxx,x);
		c[c.size()-1].v.push_back(x);
		c[c.size()-1].sz++;
	}
}
void add(int l,int r,int x){
	int pos=0;
	for(int i=0;i<c.size();i++){
		if(pos>=r) return ;
		if(pos+1>=l){
			if(pos+c[i].sz<=r){
				pos+=c[i].sz;
				c[i].maxx+=x;
				c[i].flag_sum+=x;
			}
			else {
				reset(i);
				for(int j=0;j<c[i].sz;j++){
					pos++;
					if(pos>=l&&pos<=r){
						c[i].v[j]+=x;
					}
				}
				break;
			}
		}
		else if(pos+c[i].sz>=l){
			reset(i);
			for(int j=0;j<c[i].sz;j++){
				pos++;
				if(pos>=l&&pos<=r){
					c[i].v[j]+=x;
				}
			}
		}
		else {
			pos+=c[i].sz;
			if(pos>=r) return ;
		}
	}return ;
}
void fenlie(int pos,int x){
	nd a=start,b=start;
	for(int i=0;i<c[pos].sz;i++){
		if(i<x){
			a.v.push_back(c[pos].v[i]);
			a.maxx=max(a.maxx,c[pos].v[i]);
			a.sz++;
		}
		else {
			if(a.sz==0) return ;
			b.v.push_back(c[pos].v[i]);
			b.maxx=max(b.maxx,c[pos].v[i]);
			b.sz++;
		}
	}
	if(a.sz==0||b.sz==0) return ;
	swap(c[pos],a);
	c.emplace(c.begin()+pos+1,b);
}
void SWAP(int l,int r){
	for(int i=l,j=r;i<j;i++,j--){
		swap(c[i],c[j]);
	}
	for(int i=l;i<=r;i++){
		c[i].flag_fan^=1;
	}
}
int ask(int l,int r){
	int pos=0,maxx=-1e18;
	for(int i=0;i<c.size();i++){
		if(pos>=r) return maxx;
		if(pos+1>=l){
			if(pos+c[i].sz<=r){
				maxx=max(maxx,c[i].maxx);
				pos+=c[i].sz;
			}
			else {
				for(auto j:c[i].v){
					pos++;
					if(pos>=l&&pos<=r){
						maxx=max(maxx,j+c[i].flag_sum);
					}
				}
				// break;
			}
		}
		else if(pos+c[i].sz>=l){
			for(auto j:c[i].v){
				pos++;
				if(pos>=l&&pos<=r){
					maxx=max(maxx,j+c[i].flag_sum);
				}
			}
		}
		else {
			pos+=c[i].sz;
			if(pos>=r) return maxx;
		}
	}return maxx;
}
void fanzhuan(int l,int r){
	int pos=0;
	for(int i=0;i<c.size();i++){
		if(pos>=r) return ;
		if(pos+c[i].sz<l) pos+=c[i].sz;
		else {
			if(pos<l&&pos+c[i].sz>=l){
				for(int j=0;j<c[i].sz;j++){
					pos++;
					if(pos==l){
						reset(i);
						fenlie(i,j);
						break;
					}
				}
				break;
			}
		}
	}
	pos=0;
	for(int i=0;i<c.size();i++){
		if(pos+c[i].sz>r){
			for(int j=0;j<c[i].sz;j++){
				pos++;
				if(pos==r){
					reset(i);
					fenlie(i,j+1);
					break;
				}
			}
			break;
		}pos+=c[i].sz;
	}
	pos=0;
	int L=0,R=0;
	for(int i=0;i<c.size();i++){
		if(pos+1==l){
			L=i;
		}
		pos+=c[i].sz;
		if(pos==r){
			R=i;
			break;
		}
	}
	SWAP(L,R);
}
signed main(){
  cin.tie(0)->ios::sync_with_stdio(false);
	cin>>n>>m;
	len=sqrt(n);
	c.push_back(start);
	for(int i=1;i<=n;i++){
		int x=0;
		if(c[c.size()-1].sz>=len) c.push_back(start);
		c[c.size()-1].maxx=max(c[c.size()-1].maxx,x);
		c[c.size()-1].v.push_back(x);
		c[c.size()-1].sz++;
	}
	for(int i=1;i<=m;i++){
		int op,x,y,l,r;
		cin>>op;
		if(op==1){
			cin>>l>>r>>x;
			add(l,r,x);
		}
		else if(op==2){
			cin>>l>>r;
			fanzhuan(l,r);
		}
		else {
			cin>>l>>r;
			cout<<ask(l,r)<<"\n";
		}
		if(i%len<1){
			Reset();
		}
	}
	return 0;
}
2024/9/29 08:30
加载中...