85pts求条
查看原帖
85pts求条
416192
kbzcz楼主2023/11/13 19:34

不知道为什么有三个点多1.

#include <bits/stdc++.h>
using namespace std;
#define __int __int128
#define LL long long
#define DB double
#define PII pair<int,int>
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
Tp inline void read(T& x) {
	x=0;char c=getchar();bool f=0;
	for(;c<48||c>57;c=getchar()) f|=c=='-';
	for(;c>47&&c<58;c=getchar()) x=x*10+c-48;
	f&&(x=-x);
}
Ts inline void read(T& x,_T&... y) {read(x),read(y...);}
const int N=1e5+5;
int n;
struct node {
	__int a,b,c;
}t[N];
struct edge {
	int x,y,pre;
}a[N*2];int alen,last[N];
void ins(int x,int y) {
	a[++alen]=edge{x,y,last[x]};
	last[x]=alen;
}
PII lst[N];
__int calc(__int x,int i) {
	if(t[i].c>=0) return x*t[i].b+(x+1)*x/2*t[i].c;
	else {
		__int p=min(x,max((__int)0,(__int)(1-t[i].b)/t[i].c));
		return p*t[i].b+(p+1)*p/2*t[i].c+x-p;
	}
}
int fa[N],vis[N];
void dfs(int x,int f) {
	fa[x]=f;
	for(int k=last[x];k;k=a[k].pre) {
		int y=a[k].y;
		if(y==f) continue;
		dfs(y,x);
	}
}
int res;
void update(int x,int sum) {
	if(x==0||vis[x]) {
		res+=sum;
		return ;
	}
	update(fa[x],sum+1);
	vis[x]=res-sum;
}
bool check(int lim) {
	res=0;
	for(int i=1;i<=n;i++) {
		vis[i]=0;
		lst[i].second=i;
		__int val=calc(lim,i);
		if(val<t[i].a) return 0;
		int l=1,r=n;
		while(l<r) {
			int mid=(l+r+1)>>1;
			if(val-calc(mid-1,i)>=t[i].a) l=mid;
			else r=mid-1;
		}
		lst[i].first=l;
	}
	sort(lst+1,lst+1+n);
	for(int i=1;i<=n;i++) {
		update(lst[i].second,0);
		if(vis[i]>lst[i].first) return 0;
	}
	return 1;
}
void write(int x) {
	if(x/10) write(x/10);
	putchar(x%10+'0');
}
signed main() {
	read(n);
	for(int i=1;i<=n;i++) read(t[i].a,t[i].b,t[i].c);
	for(int i=1;i<n;i++) {
		int x,y;read(x,y);
		ins(x,y);ins(y,x);
	}
	dfs(1,0);
	int l=1,r=1e9;
	while(l<r) {
		int mid=(l+r)>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	printf("%d\n",l);
	return 0;
}
2023/11/13 19:34
加载中...