线段树MLE,求助,应该递归出去了(还是递归死循环?)
查看原帖
线段树MLE,求助,应该递归出去了(还是递归死循环?)
320209
cleverxia楼主2022/2/26 20:34

rt,代码:|
                             ⁣\;\;\;\;\;\;\;\;\;\;\;\;\;\;\! V

#include<bits/stdc++.h>
using namespace std;
#define int long long
int cur,n;
int ls[500000000005ll],rs[500000000005ll],va[500000000005ll],rt;
int node(){
   return ++cur;
}
struct valaaa{
   int l,r,h;
}val[100000005];
bool cmp(valaaa x,valaaa y){
   return x.h<y.h;
}
void add(int p,int l,int r,int s,int t,int d){
   if(!p)p=node();
//	cout<<"C"<<' '<<p<<' '<<l<<' '<<r<<' '<<s<<' '<<t<<' '<<d<<' '<<va[p]<<endl;
   if(l<=s&&r>=t){
   	va[p]=d;
   	return;
   }
   	if(!ls[p])ls[p]=node();
   	if(!rs[p])rs[p]=node();
   if(s!=t&&va[p]){
   //	cout<<'N'<<'#'<<ls[p]<<' '<<rs[p]<<endl;
   	va[ls[p]]=va[rs[p]]=va[p];
   	va[p]=0;
   //	cout<<'N'<<'&'<<ls[p]<<' '<<rs[p]<<endl;
   }
   int mid=(s+t)>>1;
//	cout<<'N'<<' '<<ls[p]<<' '<<rs[p]<<endl;
   if(l<=mid)add(ls[p],l,r,s,mid,d);
   if(r>mid)add(rs[p],l,r,mid+1,t,d);
}
int query(int p,int l,int r){
//	cout<<"Q"<<' '<<p<<' '<<l<<' '<<r<<' '<<va[p]<<endl;
   if(!p)return 0;
   if(va[p]){
   	return va[p]*(r-l+1);
   }
   int mid=(l+r)>>1;
   return query(ls[p],l,mid)+query(rs[p],mid+1,r);
}
signed main(){
   ios::sync_with_stdio(false);
   cin>>n;
   rt=node();
   for(int i=1;i<=n;i++){
   	cin>>val[i].l>>val[i].r>>val[i].h;
   	val[i].r--;
   }
   sort(val+1,val+n+1,cmp);
   for(int i=1;i<=n;i++){
   	add(rt,val[i].l,val[i].r,1,1<<4,val[i].h);
   }
   cout<<query(rt,1,1<<4);
}```
2022/2/26 20:34
加载中...