运用动态开点算法,为什么要空间开到 n∗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;
}