分块入门2线段树做法,求解平均时间复杂度
  • 板块学术版
  • 楼主wangif424
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/10/28 20:33
  • 上次更新2023/11/2 11:00:49
查看原帖
分块入门2线段树做法,求解平均时间复杂度
521283
wangif424楼主2023/10/28 20:33
#include <bits/stdc++.h>
#define R(x) x = read()
#define ENDL push('\n');
#define SPACE push(' ');
#define int unsigned 
using namespace std;
char pbuf[1<<20], *pp=pbuf;
inline void push(const char &c) {
	if(pp - pbuf == 1<<20)fwrite(pbuf, 1, 1<<20, stdout),pp = pbuf;
	*pp++ = c;
}
class io {public:~io() {fwrite(pbuf, 1, pp - pbuf, stdout);}} _;
inline void write(int x) {
	if (x<0)x=-x,push('-');
	int sta[35],top=0;
	do {
		sta[top++]=x%10,x/=10;
	} while (x);
	while(top)push(sta[--top]^'0');
}
#ifndef LOCAL
	char buf[1<<23],*p1=buf,*p2=buf;
	#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
inline int read() {
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
    return x*f;
}
int n,a[50010];
struct node{
	int maxi,mini,lzy;
}t[500010];
void build(int i,int l,int r){
	if(l==r){
		t[i].maxi=t[i].mini=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	t[i].maxi=max(t[i*2].maxi,t[i*2+1].maxi);
	t[i].mini=min(t[i*2].mini,t[i*2+1].mini);
}
void pd(int i){
	if(t[i].lzy){
		t[i*2].maxi+=t[i].lzy;
		t[i*2+1].mini+=t[i].lzy;
		t[i*2+1].maxi+=t[i].lzy;
		t[i*2].mini+=t[i].lzy;
		t[i*2].lzy+=t[i].lzy;
		t[i*2+1].lzy+=t[i].lzy;
		t[i].lzy=0;
	}
}
void add(int i,int l,int r,int ll,int rr,int x){
	if(ll<=l&&r<=rr){
		t[i].lzy+=x;
		t[i].maxi+=x;
		t[i].mini+=x;
		return;
	}
	pd(i);
	int mid=(l+r)>>1;
	if(ll<=mid)add(i*2,l,mid,ll,rr,x);
	if(rr>mid)add(i*2+1,mid+1,r,ll,rr,x);
	t[i].maxi=max(t[i*2].maxi,t[i*2+1].maxi);
	t[i].mini=min(t[i*2].mini,t[i*2+1].mini);
}
int ask(int i,int l,int r,int ll,int rr,int x){
	pd(i);
	if(ll<=l&&r<=rr){
		if(x<=t[i].mini){
			return 0;
		}else if(x>t[i].maxi){
			return r-l+1;
		}else{
			int mid=(l+r)>>1;
			return ask(i*2,l,mid,ll,rr,x)+ask(i*2+1,mid+1,r,ll,rr,x);
		}
	}else{
		int mid=(l+r)>>1,res=0;
		if(ll<=mid)res+=ask(i*2,l,mid,ll,rr,x);
		if(rr>mid)res+=ask(i*2+1,mid+1,r,ll,rr,x);
		return res;
	}
}
signed main(){
//	freopen("a1.in","r",stdin);
//	freopen("OUT.out","w",stdout);
	R(n);
	for(int i=1;i<=n;i++)R(a[i]);
	build(1,1,n);
	for(int i=1,opt,l,r,c;i<=n;i++){
		R(opt);R(l);R(r);R(c);
		switch(opt){
			case 0:{
				add(1,1,n,l,r,c);
				break;
			}
			case 1:{
				write(ask(1,1,n,l,r,c*c));
				push('\n');
				break;
			}
		}
	}
    return 0;
}
2023/10/28 20:33
加载中...