线段树合并被卡常求调QAQ
查看原帖
线段树合并被卡常求调QAQ
616733
Lysea楼主2024/11/24 16:54

TLE。

#include<bits/stdc++.h>
#define N 1000005
#define int long long
namespace IO{
	template<typename T> inline void write(T x){
		if(x<0) putchar('-'),x=-x;
		if(x==0){
			putchar('0'); return ;
		}
		if(x>9) write(x/10);
		putchar(x%10+'0');
		return ;
	}
	template<typename T> inline void read(T &x){
		x=0; int w=1; char ch=getchar();
		while(!isdigit(ch)){
			if(ch=='-') w=-1; ch=getchar();
		}
		while(isdigit(ch))
			x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
		x*=w; return ;
	}
}
using namespace IO;
using namespace std;
struct star{
	int next,to;
}e[N];
struct tree{
	int v,ls,rs;
}t[N*5]; 
int n,head[N],tt[N],tot,id[N],cnt,INF,fa[N];
void add(int u,int v){
    e[++cnt].next=head[u];
    head[u]=cnt;
    e[cnt].to=v;
}
int v[N],ans,rt[N];
void push_up(int p){
	t[p].v=t[t[p].ls].v+t[t[p].rs].v;
} 
void add(int &p,int l,int r,int v){
	if(!p) p=++tot;
	if(l==r){
		t[p].v++;
		return;
	}
	int mid=l+r>>1;
	if(v<=mid) add(t[p].ls,l,mid,v);
	else add(t[p].rs,mid+1,r,v);
	push_up(p);
}
int query(int p,int l,int r,int vl,int vr){
	if(!p) return 0;
	if(l>=vl&&r<=vr) return t[p].v;
	int mid=l+r>>1,res=0;
	if(vl<=mid) res+=query(t[p].ls,l,mid,vl,vr);
	if(r>mid) res+=query(t[p].rs,mid+1,r,vl,vr);
	return res;
}
int mer(int p,int q,int l,int r){
	if(!p||!q) return p+q;
	if(l==r){
		t[p].v+=t[q].v;
		return p;
	} 
	int mid=l+r>>1;
	t[p].ls=mer(t[p].ls,t[q].ls,l,mid);
	t[p].rs=mer(t[p].rs,t[q].rs,mid+1,r);
	push_up(p); return p;
}
bool cmp(int x,int y){
    return tt[x]>tt[y];
}
int Find(int x){
    if(x==fa[x]) return x;
    return fa[x]=Find(fa[x]);
}
signed main(){
    read(n);
    for(int i=1;i<=n;i++) read(tt[i]),fa[i]=id[i]=i;
    for(int i=1;i<=n;i++) read(v[i]),INF=max(INF,v[i]);
    for(int i=1,u,v;i<n;i++){
        read(u),read(v);
        add(u,v),add(v,u);
    }
    sort(id+1,id+n+1,cmp);
    for(int i=1,u;i<=n;i++){
    	u=id[i],ans+=u;
    	add(rt[u],1,INF,v[u]);
    	for(int j=head[u];j;j=e[j].next){
    		int y=Find(e[j].to);
    		if(tt[y]<tt[u]) continue;
    		ans+=u*query(rt[u],1,INF,1,v[u])*query(rt[y],1,INF,v[u],INF);
    		ans+=u*query(rt[y],1,INF,1,v[u])*query(rt[u],1,INF,v[u],INF);
			fa[y]=u,rt[u]=mer(rt[u],rt[y],1,INF);
		}
    }write(ans);
    return 0;
}
2024/11/24 16:54
加载中...