求证空间复杂度
  • 板块学术版
  • 楼主SSER_ZRQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/20 15:42
  • 上次更新2023/11/3 08:38:37
查看原帖
求证空间复杂度
401231
SSER_ZRQ楼主2023/7/20 15:42

这题

运用动态开点算法,为什么要空间开到 n∗64n*64 ?

有没有dalao说明一下?

#include <bits/stdc++.h>
using namespace std;
#define N 40005
#define ll long long
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
int n,t[N<<6],cnt=1;
struct node{
	int l,r;
	ll s;
}c[N<<6];
struct AB{
	int l,r,h;
	bool operator <(const AB &A) const{
		return h<A.h;
	}
}d[N];
inline void push_down(int p,int l,int r){
	if(!t[p]) return ;
	if(l==r) return ;
	int mid=l+r>>1;
	if(!c[p].l) c[p].l=++cnt;
	if(!c[p].r) c[p].r=++cnt;
	t[c[p].l]=t[c[p].r]=t[p];
	c[c[p].l].s=1ll*(mid-l+1)*t[p];
	c[c[p].r].s=1ll*(r-mid)*t[p];
	t[p]=0;
}
int update(int p,int l,int r,int x,int y,int z){
	if(!p) p=++cnt;	
//	printf("%d %d %d %d %d %d %lld %d\n",p,l,r,x,y,z,c[p].s,t[p]);
	if(x<=l&&r<=y){
		t[p]=z,c[p].s=1ll*(r-l+1)*z;
		return p;
	}
	push_down(p,l,r);
	int mid=l+r>>1;
	if(x<=mid) c[p].l=update(c[p].l,l,mid,x,y,z);
	if(y>mid) c[p].r=update(c[p].r,mid+1,r,x,y,z);
	c[p].s=c[c[p].l].s+c[c[p].r].s;
//	printf("%d %lld\n",p,c[p].s);
	return p;
}
inline void work(){
	n=read();
	for(int i=1;i<=n;i++){
		d[i].l=read(),d[i].r=read()-1,d[i].h=read();
//		printf("%d %d %d\n",d[i].l,d[i].r,d[i].h);
	}
	sort(d+1,d+n+1);
	for(int i=1;i<=n;i++){
//		printf("          %d %d %d %d\n",i,d[i].l,d[i].r,d[i].h);
		t[0]=update(1,1,1e9,d[i].l,d[i].r,d[i].h);
//		printf("%lld %lld\n",c[1].s,c[0].s);
	}
	printf("%lld\n",c[1].s);
}
int main(){
	int T=1;
	while(T--) work();
	return 0;
}


2023/7/20 15:42
加载中...