90pts,wa+tle,求调
查看原帖
90pts,wa+tle,求调
739552
mygr楼主2023/11/2 10:45
#include<bits/stdc++.h>
#define int long long
#define int128 __int128
using namespace std;
const int Max=5e5+5;
int n;
struct area{
	int128 a;
	int b,c;
}g[Max];
struct edge{
	int to,next;
}p[Max];
int head[Max],idx=0;
void add(int u,int v)
{
	p[++idx].next=head[u];
	head[u]=idx;
	p[idx].to=v;
}
int128 read()
{
	int w=0,minue=1;
	char c=getchar();
	while(c<'0' or '9'<c)
	{
		if(c=='-')
			minue=-1;
		c=getchar();
	}
	while('0'<=c and c<='9')
	{
		
		w*=10;
		w=w+(int128)(c-'0');
		c=getchar();
	}
	return w*minue;
}
int need[Max];
int calc(int now,int m)
{
	int l=0,r=m;
	int128 t;
	if(g[now].c<0)
		t=(1-g[now].b)/g[now].c;
	while(l<r)
	{
		int128 mid=(l+r+1)>>1;
		int128 s=0;
		if(g[now].c>=0)
		{
			s=((g[now].b+(int128)g[now].c*mid)+((int128)g[now].c*m+g[now].b))*(m-mid+1)/2;
		} 
		else
		{
			
			if(mid<t and t<m)
			{
				s=(m-t);
				s+=((g[now].b+(int128)g[now].c*mid)+((int128)g[now].c*(t-1)+g[now].b))*(t-mid)/2;
			}
			else if(mid<t and m<t)
			{
				s+=((g[now].b+(int128)g[now].c*mid)+((int128)g[now].c*m+g[now].b))*(m-mid+1)/2;
			}
			else
			{
				s=(m-mid);
			}
		}
		if(s>=g[now].a)
		{
			l=mid;
		}
		else
		{
			r=mid-1;
		}
	}
	return l;
}
bool vis[Max];
int fa[Max];
void dfs(int now,int from)
{
	fa[now]=from;
	for(int i=head[now];p[i].to;i=p[i].next)
	{
		if(p[i].to==from)
			continue;
		dfs(p[i].to,now);
	}
}
int paint(int now)
{
	vis[now]=true;
	if(vis[fa[now]] or now==1)
	{
		return 1;
	}
	return paint(fa[now]);
}
bool check(int now)
{
	priority_queue<pair<int,int> > in;
	int t=0;
	for(int i=1;i<=n;i++)
	{
		need[i]=calc(i,now);
		vis[i]=false;
		in.push(make_pair(-need[i],i));
	}
	while(!in.empty())
	{
		int x=in.top().second;
		in.pop();
		t+=paint(x);
		if(t>need[x])
			return false;
	}
	return true;
}
signed main()
{
	//freopen("tree4.in","r",stdin);
	//freopen("tree.out","w",stdout);
	int l=1,r=1e9+5;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		g[i].a=read();
		g[i].b=read();
		g[i].c=read();
	}
	int x,y;
	for(int i=1;i<n;i++)
	{
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(1,1);
	while(l<r)
	{
 		int mid=(l+r)>>1;
		if(check(mid))
			r=mid;
		else
			l=mid+1;
	}
	printf("%lld",l);
}
2023/11/2 10:45
加载中...