求助CSP-S T4
查看原帖
求助CSP-S T4
235901
Always_Remember_It楼主2023/10/25 15:31
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=510;
const int INF=0x7f7f7f7f7f7f7f7f;
const int MAXN=1e9;
int n,a[N],b[N],c[N];
int head[N],tot,tim[N],lst[N],minn=INF;
bool vis[N];
struct Edge{
	int next,to;
}e[N<<1];
void adde(int u,int v){
	e[++tot].next=head[u];
	e[tot].to=v;
	head[u]=tot;
}
void dfs(int day){
	if(day>=minn) return;
	if(day>=n){
		for(int i=1;i<=n;i++){
			if(c[i]==0){
				lst[i]=(a[i]-1)/b[i]+tim[i];
				continue;
			}
			if(c[i]>0){
				int l=tim[i],r=MAXN,mid=0,ans=INF;
				while(l<=r){
					mid=(l+r)>>1;
					int num=mid-tim[i]+1;
					int now=b[i]*num+(tim[i]+mid)*num/2*c[i];
					if(now>=a[i]) ans=min(ans,mid),r=mid-1;
					else l=mid+1;
				}
				lst[i]=ans;
				continue;
			}
			int l=1,r=MAXN,mid=0,point=0;
			while(l<=r){
				mid=(l+r)>>1;
				int now=b[i]+mid*c[i];
				if(now<1) r=mid-1;
				else point=max(point,mid),l=mid+1;
			}
   			if(tim[i]>point){
   				lst[i]=a[i]+tim[i]-1;
   				continue;
			}
			l=tim[i],r=MAXN,mid=0;
			int ans=INF;
			while(l<=r){
				mid=(l+r)>>1;
			   	if(mid<=point){
			   		int num=mid-tim[i]+1;
			   		int now=num*b[i]+(tim[i]+mid)*num/2*c[i];
			   		if(now>=a[i]) ans=min(ans,mid),r=mid-1;
			   		else l=mid+1;
			   		continue;
				}
				int num=point-tim[i]+1;
				int now=num*b[i]+(tim[i]+point)*num/2*c[i]+mid-point;
				if(now>=a[i]) ans=min(ans,mid),r=mid-1;
				else l=mid+1;
			}
			lst[i]=ans;
		}
		int maxn=0;
		for(int i=1;i<=n;i++){
			maxn=max(maxn,lst[i]);
		}
		minn=min(minn,maxn);
		return;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]) continue;
		for(int j=head[i];j;j=e[j].next){
			int v=e[j].to;
			if(vis[v]) continue;
			vis[v]=1;
			tim[v]=day+1;
			dfs(day+1);
			vis[v]=0;
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i]>>c[i];
	}
	for(int i=1;i<n;i++){
		int u,v;cin>>u>>v;
		adde(u,v);
		adde(v,u);
	}
	vis[1]=1;
	tim[1]=1;
	dfs(1);
	cout<<minn<<endl;
	return 0;
}
2023/10/25 15:31
加载中...