80分求调,WAon#5
查看原帖
80分求调,WAon#5
671925
caotianhao楼主2023/10/3 09:57

题外话:MD暴力比线段树分还高

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
typedef long long ll;
int n,m,sp;
ll a[N*2];
struct ST{
	int l,r;
	int num;
	int la;
}t[N*4];
ll getnum(){
    int res = 0, f = 1;
    char c = getchar();
    while (!isdigit(c)){
        if (c == '-')
            f=-1;
        c=getchar();
    }
    while (isdigit(c)){
    	res=res*10+c-48;
		c=getchar();
	}   
    if (c==' ')
        ++sp;
    return res * f;
}
void build(int node,int l,int r){
	t[node].l=l;
	t[node].r=r;
	if(l==r){
		t[node].num=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(node*2,l,mid);
	build(node*2+1,mid+1,r);
	t[node].num=t[node*2].num+t[node*2+1].num;
}
void pd(int node){
	if(t[node].la!=0){
		t[node*2].la+=t[node].la;
		t[node*2+1].la+=t[node].la;
		t[node*2].num+=t[node].la;
		t[node*2+1].num+=t[node].la;
		t[node].la=0;
	}
}
void add(int l,int r,int k,int node){
	if(t[node].l>=l&&t[node].r<=r){
		t[node].num+=k;
		t[node].la+=k;
		return ;
	}
	pd(node);
	if(t[node*2].r>=l){
    	add(l,r,k,node*2);
	}
	if(t[node*2+1].l<=r){
		add(l,r,k,node*2+1);
	}
	t[node].num=min(t[node*2].num,t[node*2+1].num);
}
void cop(int l,int r,int k){
	if(r<=n){
		add(l+n,r+n,k,1);
	}else if(l>n){
		add(l-n,r-n,k,1);
	}else{
		add(n+l,n+n,k,1);
		add(1,r-n,k,1);
	}
}
ll query(int node,int l,int r){
	if(t[node].l>r||t[node].r<l){
		return LONG_LONG_MAX;
	}
	if(t[node].l>=l&&t[node].r<=r){
		return t[node].num;
	}
	return min(query(node*2,l,r),query(node*2+1,l,r));
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i];
	}
	//for(int i=1;i<=n*2;i++){
	//	cout<<a[i]<<' ';
	//}
//	cout<<"\n";
	cin>>m;
	build(1,1,n*2);
	while(m--){
		ll l=getnum(),r=getnum(),v;
		l++;
		r++;
		//cout<<l<<' '<<r<<"\n";
		if(sp==2){
			cin>>v;
			if(r<l){
				r+=n;
			}
			add(l,r,v,1);
			cop(l,r,v);
			//for(int i=l;i<=r;i++){
			//	a[i]+=v;
			//	if(i<=n){
			//		a[i+n]+=v;
			//	}else{
			//		a[i-n]+=v;
			//	}
			//}
		}else{
			if(r<l){
				r+=n;
			}
			cout<<query(1,l,r)<<"\n";
		}
		sp=0;
		//for(int i=1;i<=n*2;i++){
		//	cout<<a[i]<<' ';
		//}
		//cout<<"\n"; 
	}
	return 0; 
}
2023/10/3 09:57
加载中...