萌新刚学OI求助!!
  • 板块P4178 Tree
  • 楼主Cyber_Tree
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/2/19 19:33
  • 上次更新2023/11/5 03:01:51
查看原帖
萌新刚学OI求助!!
109634
Cyber_Tree楼主2021/2/19 19:33
#include<bits/stdc++.h>
using namespace std;
const int N=4e4+10;
inline int read(){
	int f=1,x=0; char ch=getchar();
	while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }
	while(isdigit(ch)) { x=x*10+ch-48; ch=getchar(); }
	return f*x;
}
int n,k;
int head[N],cnt,ans;
int rt,mx[N],siz[N];
bool vis[N];
class BIT{
private:
	int a[N],n;
	int lb(int x){return x&-x;}
public:
	void init(int x) { n=x; };
	void add(int p,int x) { p++; for(;p<=n;p+=lb(p)) a[p]+=x; }
	int sum(int p){
		int ans=0; p++;
		for(;p;p-=lb(p)) ans+=a[p];
		return ans;
	}
}t;
struct EDGE{
	int t,nxt;
	int w;
}l[N<<1];
void add(int a,int b,int c){
	l[++cnt].nxt=head[a];
	l[cnt].t=b;
	l[cnt].w=c;
	head[a]=cnt;
}
void find(int u,int fa,int s){
	siz[u]=1,mx[u]=0;
	for(int i=head[u];i;i=l[i].nxt){
		int v=l[i].t;
		if(vis[v]||v==fa) continue;
		find(v,u,s);
		mx[u]=max(mx[u],siz[v]);
	}
	mx[u]=max(mx[u],s-siz[u]);
	if(mx[u]<mx[rt]) rt=u;
}
int stk[N],top,r[N],tp;
void get_dis(int u,int fa,int dis){
	if(dis>k)return;
	r[++tp]=dis;
	for(int i=head[u];i;i=l[i].nxt){
		int v=l[i].t;
		if(vis[v]||v==fa) continue;
		get_dis(v,u,dis+l[i].w); 
	}
}
void solve(int u){
	top=0;
	for(int i=head[u];i;i=l[i].nxt){
		int v=l[i].t;
		if(vis[v]) continue;
		tp=0;
		get_dis(v,u,l[i].w);
		for(int j=1;j<=tp;j++) if(r[j]<=k) ans+=t.sum(k-r[j])+1;
		for(int j=1;j<=tp;j++) if(r[j]<=k) stk[++top]=r[j],t.add(r[j],1);
	}
	while(top) t.add(stk[top--],-1);
	return;
}
void del(int u){
	vis[u]=1;
	solve(u);
	for(int i=head[u];i;i=l[i].nxt){
		int v=l[i].t;
		if(vis[v]) continue;
		rt=0;
		find(v,u,siz[v]);
		del(rt);
	}
	return;
}
int main(void){
	n=read();
	int a,b,c;
	for(int i=1;i<n;i++){
		a=read(),b=read(),c=read();
		add(a,b,c); add(b,a,c);
	}
	k=read();
	t.init(k+2);
	mx[0]=n+1;
	find(1,0,n);
	del(rt);
	printf("%d\n",ans);
	return 0;
}

萌新刚学OI求助!!!

莫名被 T 成了30分。。。

除了2、3、4都被 T 了

自我感觉非常良好。。。应该不是常数的问题。。。

可能是由NT错误。。求大佬指点。

2021/2/19 19:33
加载中...