15pts求助
查看原帖
15pts求助
800499
suzhikz楼主2024/10/22 19:01
#include<bits/stdc++.h>
#define ll __int128
#define reg register
#define db double
#define il inline
#define int __int128
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
//void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void print(int x){
	if(x<10)putchar(x+'0');
	else{
		print(x/10);putchar(x%10+'0');
	}
}
const int N=1e5+5; 
ll a[N],b[N],c[N],n;
ll day[N];
vector<int>g[N];
int fa[N];
int vis[N];
void dfs(int x,int f){
	vis[x]=1;
	for(int i:g[x]){
		if(i==f)continue;
		fa[i]=x;
		dfs(i,x);
	}
}
struct node{
	ll la,id;
}z[N];
bool cmp(node a,node b){
	return a.la<b.la;
}
bool check(int x){
	memset(vis,0,sizeof(vis));
	vis[0]=1;
	for(int i=1;i<=n;i++){
		z[i].la=0;
		z[i].id=i;
		if(x>=day[i]&&day[i]!=0){
			if(x-day[i]+1>=a[i]){
				z[i].la=x-a[i]+1;
			}else{
				int l=0,r=day[i]-1,mid;
				while(l<=r){
					mid=(l+r)/2;
					if((day[i]-mid)*b[i]+(mid+day[i]-1)*(day[i]-mid)/2*c[i]+x-day[i]+1>=a[i]){
						z[i].la=mid;
						l=mid+1;
					}else{
						r=mid-1;
					}
				}
			}
		}else{
			ll l=0,r=x-1,mid;
			while(l<=r){
				mid=(l+r)/2;
				if((x-mid+1)*b[i]+(mid+x)*(x-mid+1)/2*c[i]>=a[i]){
					z[i].la=mid;
					l=mid+1;
				}else{
					r=mid-1;
				}
			}
		}
		if(z[i].la==0)return 0;
//		print(i);cout<<' ';print(z[i].la);puts("");
//		cout<<x<<' '<<z[i].la<<endl;
	}
	sort(z+1,z+1+n,cmp);
	int tim=0;
	for(int i=1;i<=n;i++){
		if(vis[i])continue;
		int j=z[i].id;
		while(!vis[j]){
			vis[j]=1;
			tim++;
			j=fa[j];
		}
		if(tim>z[i].la)return 0;
	}
	return 1;
}
signed main(){
	read(n);
	for(int i=1;i<=n;i++){
		read(a[i]);read(b[i]);read(c[i]);
		ll l=0,r=100000000,mid;
		if(c[i]<0)
		while(l<=r){
			mid=(l+r)/2;
			if(c[i]*mid+b[i]<=1){
				day[i]=mid;
				r=mid-1;
			}else{
				l=mid+1;
			}
		}
//		cout<<day[i]<<endl;
	}
	for(int u,v,i=1;i<n;i++){
		read(u);read(v);
		g[u].push_back(v);
		g[v].push_back(u); 
	}
	dfs(1,0);
	ll l=n,r=1e18,ans=0,mid;
	check(33577724);return 0;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			ans=mid;r=mid-1;
		}else{
			l=mid+1;
		}
	}
	print(ans);
	cout<<endl<<endl<<endl<<endl;
	
	return 0;
}

2024/10/22 19:01
加载中...