点分治T了,50pts
查看原帖
点分治T了,50pts
673643
GameFreak楼主2023/1/3 17:10

rt,如题,按第一篇题解思路写的,50pts TLE,评测记录

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
#define flush() fwrite(obuf,p3-obuf,1,stdout)
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<1000000)?(*p3++=x):(flush(),p3=obuf,*p3++=x)
template<typename T> inline void read(T&);
template<typename T> inline void write(T);
template<typename... Args> inline void read(Args& ...);
template<typename... Args> inline void write(Args ...);
const int N=200005;
int n,ans=N,K;
struct edge{
	int to,val;
	edge():to(0),val(0){}
	edge(int To,int Val):to(To),val(Val){}
};
vector<edge> G[N];
int root,max_part,all;
bool alive[N],vis[N];
int dis[N],dep[N],siz[N];
int a[N];
int cnt[1000005];
void find(const int& u){
	int now=0;
	siz[u]=1;
	for(edge e:G[u])
		if(!vis[e.to]&&!alive[e.to])
			vis[e.to]=1,find(e.to),siz[u]+=siz[e.to],now=max(now,siz[e.to]);
	now=max(now,all-siz[u]);
	if(now<=max_part) root=u,max_part=now;
}
void calc(const int& u,const int& rt){
	if(dis[u]>K) return;
	a[++a[0]]=u;
	for(edge e:G[u])
		if(!vis[e.to]&&!alive[e.to]) vis[e.to]=1,dis[e.to]=dis[u]+e.val,dep[e.to]=dep[u]+1,calc(e.to,rt);
}
void clear(const int& u){
	vis[u]=0;
	for(edge e:G[u])
		if(vis[e.to]) clear(e.to);
}
int pos[N];
inline bool cmp(const int& u,const int& v){return dis[u]<dis[v];}
queue<int> opt;
void dfs(const int& u){
	vis[u]=1,find(u);
	clear(u);
	cnt[0]=0,a[0]=0,alive[root]=1;
	for(edge e:G[root])
		if(!vis[e.to]&&!alive[e.to]){
			vis[e.to]=1,dis[e.to]=e.val,dep[e.to]=1,calc(e.to,e.to);
			for(int k=1;k<=a[0];k++)
				if(K>=dis[a[k]]) ans=min(ans,dep[a[k]]+cnt[K-dis[a[k]]]);
			for(int k=1;k<=a[0];k++)
				if(dis[a[k]]<K) opt.emplace(a[k]),cnt[dis[a[k]]]=min(cnt[dis[a[k]]],dep[a[k]]);
			a[0]=0;
		}
	while(!opt.empty()) cnt[dis[opt.front()]]=0x3f3f3f3f,dis[opt.front()]=dep[opt.front()]=siz[opt.front()]=vis[opt.front()]=0,opt.pop();
	for(edge e:G[root])
		if(!alive[e.to])
			max_part=all=siz[e.to],dfs(e.to);
}
signed main(){
	memset(cnt,0x3f,sizeof cnt);
	read(n,K);
	for(int i=1,u,v,w;i<n;i++) read(u,v,w),++u,++v,G[u].emplace_back(edge(v,w)),G[v].emplace_back(edge(u,w));
	max_part=all=n,dfs(1);
	write(ans>=n?-1:ans);
	flush();
	return 0;
}

template<typename T> inline void read(T& x){
	x=0;bool flag=0;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') flag=1;
	if(flag) for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)-(ch&15);
	else for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch&15);
}
template<typename T> inline void write(T x){
    static int sta[40];
    int top=0;
    if(x<0){
        putchar('-');
        do sta[top++]=(-x)%10,x/=10;
        while(x);
    }
    else{
        do sta[top++]=x%10,x/=10;
        while(x);
    }
    while(top) putchar(sta[--top]^48);
}
template<typename... Args> inline void read(Args& ...args){(void)initializer_list<int>{(read(args),0)...};}
template<typename... Args> inline void write(Args ...args){(void)initializer_list<int>{(write(args),0)...};}
2023/1/3 17:10
加载中...