85pts,TLE,求调
查看原帖
85pts,TLE,求调
780377
LDR___楼主2023/11/3 16:46
#include<bits/stdc++.h>
#define ll long long
#define ull __int128
using namespace std;
const ll N=1e5+5,M=1e9;
int n,u,v;
int dep[N],vis[N];
ll a[N],b[N],c[N];
ull ans;
vector<int>vec[N];
struct A{
	ll last,dep;
}g[N];
bool cmp(A x,A y){
	if(x.last==y.last)return x.dep<y.dep;
	return x.last<y.last;
}
void bfs(){
	queue<int>q;
	q.push(1);
	while(!q.empty()){
		int u=q.front();q.pop();
		vis[u]=1;
		for(int i=0;i<vec[u].size();i++){
			int v=vec[u][i];
			if(vis[v])continue;
			dep[v]=dep[u]+1;
			q.push(v);
		}
	}
}
inline ull f(int i,ull x){
	if(c[i]>0)return b[i]*x+((x+1)*x>>1)*c[i];
	ull p=b[i]/(-c[i])-1;//最后一个不为1的点 
	if(b[i]%c[i])p++;
	if(x<=p){
		return b[i]*x+((x+1)*x>>1)*c[i];
	}else{
		return b[i]*p+((p+1)*p>>1)*c[i]+x-p;
	}
}
inline bool check(ull day){
	//printf("%lld\n",day);
	for(int i=1;i<=n;i++){
		g[i].last=0;
		//printf("i%d\n",i);
		if(c[i]==0){
			ll x=a[i]/b[i];
			if(a[i]*b[i])x++;
			g[i].last=day-x+1;
		}else{
			//continue;
			if(f(i,day)<(ull)a[i])return 0;
			ull l=dep[i]+1,r=day,mid;
			while(l<=r){
				mid=(l+r)>>1;
				if(f(i,day)-f(i,mid-1)>=a[i]){
					g[i].last=mid,l=mid+1;
				}else{
					r=mid-1;
				}
			}
		}
		if(g[i].last<dep[i]-1)return 0;
	}
	for(int i=1;i<=n;i++)g[i].dep=dep[i];
	sort(g+1,g+1+n,cmp);
	for(int i=1;i<=n;i++){
		if(g[i].last<i)return 0;
	}
	return 1;
}
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void print(ull n){
	if(n<0){
		putchar('-');
		n*=-1;
	}
	if(n>9){
		print(n/10);
	}
	putchar(n%10+'0');
}
int main(){
	freopen("tree4.in","r",stdin);
//	freopen("out.txt","w",stdout);
//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();b[i]=read();c[i]=read();
	}
	for(int i=1;i<n;i++){
		u=read();v=read();
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	bfs();
	ull l=n,r=1e9,mid;
	while(l<=r){
		mid=(l+r)>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	print(ans);
	return 0;
}/*
1
104106344342196574 602770360 98
*/
2023/11/3 16:46
加载中...