求调95分,WA#15,已看过警示后人
查看原帖
求调95分,WA#15,已看过警示后人
794062
zhazesheng楼主2024/10/24 12:39
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;bool flag=true;
	char ch=getchar();
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') flag=false,ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	if(flag) return x;
	else return -x;
} 
#define N 100005
#define ll unsigned long long
int n,b[N],c[N],fa[N],latest[N],idx[N];
ll a[N];bool vis[N];
int nxt[N<<1],head[N],to[N<<1],top=0;
ll countr(int x,ll l,ll r){
	if(c[x]==0) return b[x]*(r-l+1);
	if(c[x]>0) return b[x]*(r-l+1)+c[x]*(r+l)*(r-l+1)/2;
	ll imax=(1-b[x])/c[x];
	if(imax<l) return r-l+1;
	if(imax>r) return b[x]*(r-l+1)+c[x]*(r+l)*(r-l+1)/2;
	return b[x]*(imax-l+1)+c[x]*(imax+l)*(imax-l+1)/2+r-imax;
}
void addedge(int a,int b){
	to[++top]=b;
	nxt[top]=head[a];
	head[a]=top;
}
void dfs(int x){
	for(int i=head[x];i;i=nxt[i]){
		if(to[i]==fa[x]) continue;
		fa[to[i]]=x;
		dfs(to[i]);
	}
	return ;
}
bool cmp(int a,int b){
	return latest[a]<latest[b];
}
bool checktr(int lastt){
	for(int i=1;i<=n;i++){
		int l=1,r=lastt,mid;
		while(l<r){
			mid=(l+r+1)/2;
			if(countr(i,mid,lastt)>=a[i]) l=mid; 
			else r=mid-1;
		}
		latest[i]=l;
		idx[i-1]=i;
		vis[i]=false;
	}
	vis[1]=true;
	sort(idx+1,idx+n,cmp);
	int ord=1,j;
	for(int i=1;i<=n-1;i++){
		j=idx[i];
		if(vis[j]) continue;
		while(!vis[j]) ord++,vis[j]=true,j=fa[j];
		if(ord>latest[idx[i]]) return false;
	}
	return true;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		b[i]=read();c[i]=read();
	}
	int u,v;
	for(int i=1;i<=n-1;i++){
		u=read();v=read();
		addedge(u,v);
		addedge(v,u);
	}
	dfs(1);
	int l=1,r=1e9,mid=(l+r)/2;
	while(l<r){
		if(checktr(mid)) r=mid;
		else l=mid+1;
		mid=(l+r)/2;
	}
	printf("%d",l);
	return 0;
}
2024/10/24 12:39
加载中...