95pts求助,悬赏一关
查看原帖
95pts求助,悬赏一关
895690
gghack_Nythix楼主2023/11/22 22:27

rt

#include<bits/stdc++.h>
#define rrg register 
#define int __int128
using namespace std;
int n;
char buf[1 << 20],*p1,*p2;
#define getc() getchar()
int read(){int x = 0,w = 1;char cc = getc();if(cc < '0' || cc > '9'){if(cc == '-')w = -1;cc = getc();}while(cc <= '9' && cc >= '0'){x = x * 10 + (cc ^ 48);cc = getc();}return x * w;}
inline void print(int x){if(x < 0){x = -x;putchar('-');}if(x > 9)print(x / 10);putchar(x % 10 + 48);}
struct node{
	long long a,b,c;
}vv[200005];
vector<int>g[200005];
int ans;
bool vis[200005];
int fa[200005];
bool calc(long long l,long long r,long long i){
	int day = (r - l + 1);
	if(vv[i].c >= 0){
		int tmp = ((vv[i].b + l * vv[i].c) + (vv[i].b + r * vv[i].c)) * day / 2;
		if(tmp < vv[i].a)return 0;
	}
	if(vv[i].c < 0){
		if(vv[i].b + l * vv[i].c < 1)if(day < vv[i].a)return 0;
		else{
			int tmp = vv[i].b + l * vv[i].c;
			int step = ceil(tmp / 1.0 * (-vv[i].c));
			int tmp3 = (1 + tmp) * step / 2;
			if(tmp3 + (day - step) < vv[i].a)return 0;
		}
	}
	return 1;
}
inline bool chk(int tme){
	vector< pair<long long,long long> >ve;
	for(register long long i = 1;i <= n;++i){
		long long l = 0,r = tme,ttt = 0;
		while(l <= r){
			long long mid = l + r >> 1;
			if(calc(mid,tme,i))l = mid + 1,ttt = mid;
			else r = mid - 1;
		}
		if(i == 1 && !ttt)return 0;
		ve.push_back(make_pair(ttt,i));
		if(ttt <= 1 && i != 1)return 0;
	}
	sort(ve.begin(),ve.end());
	vector<long long>flct(n + 5,0);
	flct[1] = 1;
	for(rrg long long i = 0;i < ve.size();++i)flct[i + 2] = ve[i].second;
	memset(vis,0,sizeof(vis));
	vis[0] = 1;
	int t = 0;
	for(rrg long long i = 1;i <= n;++i){
		int now = flct[i];
		while(!vis[now])t++,vis[now] = 1,now = fa[now];
		if(i > 1 && t > ve[max(i - 2,0ll)].first)return 0;
	}
	return 1;
}
void dfs(int now,int fath){
	fa[now] = fath;
	for(auto x : g[now])if(x != fath)dfs(x,now);
}
int u,v;
signed main(){
	// freopen("tree2.in","r",stdin);
	n = read();
	for(rrg int i = 1;i <= n;++i){
		vv[i].a = read();
		vv[i].b = read();
		vv[i].c = read();
	}
	for(rrg int i = 1;i <= n;++i){
		u = read();
		v = read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,0);
	long long l = n,r = 1e9 + 5;
	while(l <= r){
		long long mid = l + r >> 1;
		if(chk(mid))ans = mid,r = mid - 1;
		else l = mid + 1;
	}
	print(ans);
	return 0;
}

2023/11/22 22:27
加载中...