WA 50pts求助
查看原帖
WA 50pts求助
520056
luoyx楼主2024/10/24 23:02
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int n,m;
int u,v;
ll w;

inline int read() {
	int s = 0,f = 1;char ch = getchar();
	while (!isdigit(ch)) f = ch == '-' ? -1 : 1, ch = getchar();
	while (isdigit(ch)) s = (s << 3) + (s << 1) + ch - '0', ch = getchar();
	return s*f;
}

const int N=5e5+5,inf=2e9;
int head[N],ecnt;
struct edge{
	int v,nxt;
	ll w;
}e[N<<1];
void add(int u,int v,ll w){
	e[++ecnt].v=v;
	e[ecnt].nxt=head[u];
	e[ecnt].w=w;
	head[u]=ecnt;
}

int fa[N],siz[N],son[N];
ll dep[N];
void dfs(int u,int father,int d){
	dep[u]=d;
	siz[u]=1;
	fa[u]=father;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v!=father){
			dfs(v,u,d+e[i].w);
			siz[u]+=siz[v];
			if(siz[son[u]]<siz[v]) son[u]=v;
		}
	}
}
ll num[N],cnt;
void init(){
	dfs(1,0,0);
	for(int i=1;i<=n;i++){
		num[++cnt]=dep[i];
	}
	sort(num+1,num+cnt+1);
	cnt=unique(num+1,num+cnt+1)-num-1;
	for(int i=1;i<=n;i++){
		dep[i]=lower_bound(num+1,num+cnt+1,dep[i])-num;
	}
}

struct node{
	int x,y;
	int dep;
};
vector<node> vec[N];

set<int> st[N];
int rt[N],rtcnt;
void insert(int lca,int v){
	int l=*(--st[rt[lca]].lower_bound(v));
	int r=*(st[rt[lca]].lower_bound(v));
	if(l) vec[dep[lca]].push_back((node){l,v});
	if(r!=inf) vec[dep[lca]].push_back((node){v,r});
}
void dfs2(int u,int lca){
	insert(lca,u);
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v!=fa[u]){
			dfs2(v,lca);
		}
	}
	st[rt[lca]].insert(u);
}
void DSU(int u){
	if(!son[u]){
		rt[u]=++rtcnt;
		st[rt[u]].insert(u);
		st[rt[u]].insert(0);
		st[rt[u]].insert(inf);
		vec[dep[u]].push_back({u,u});
		return ;
	}
	else{
		DSU(son[u]);
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(v!=fa[u]&&v!=son[u]) DSU(v);
		}
		rt[u]=rt[son[u]];
		vec[dep[u]].push_back({u,u});
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v;
			if(v!=fa[u]&&v!=son[u]){
				dfs2(v,u);
			}
		}
		st[rt[u]].insert(u);
	}
}

struct tree{
	int f[N<<2];
	void upd(int x,int k){
		while(x<=n){
			f[x]+=k;
			x+=x&(-x);
		}
	}
	int query(int x){
		int ans=0;
		while(x>0){
			ans+=f[x];
			x-=x&(-x);
		}
		return ans;
	}
}T;

struct Q{
	int l,r,ans,id;
}q[N];
vector<int> vq[N];
vector<node> va[N];
int lst[N];
void QUERIES(){
	for(int i=1;i<=m;i++){
		q[i].l=read(),q[i].r=read();
		q[i].id=i;
		vq[q[i].r].push_back(i);
	}
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<vec[i].size();j++){
			vec[i][j].dep=i;
			va[vec[i][j].y].push_back(vec[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<va[i].size();j++){
			node now=va[i][j];
			if(lst[now.dep]==0){
				lst[now.dep]=now.x;
				T.upd(lst[now.dep],1);
			}
			else if(lst[now.dep]<now.x){
				T.upd(lst[now.dep],-1);
				lst[now.dep]=now.x;
				T.upd(lst[now.dep],1);
			}
		}
		for(int j=0;j<vq[i].size();j++){
			q[vq[i][j]].ans=T.query(i)-T.query(q[vq[i][j]].l-1);
		}
	}
	for(int i=1;i<=m;i++) printf("%d\n",q[i].ans);
}

int main(){
	cin>>n>>m;
	for(int i=1;i<n;i++){
		u=read(),v=read(),w=read();
		add(u,v,w),add(v,u,w);
	}
	init();
	DSU(1);
	QUERIES();
	return 0;
}

2024/10/24 23:02
加载中...