关于 S T4
  • 板块学术版
  • 楼主lsj2009Isj2OO9
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/10/21 21:01
  • 上次更新2023/11/2 12:08:41
查看原帖
关于 S T4
468657
lsj2009Isj2OO9楼主2023/10/21 21:01

是正解,但是云斗上 T 了,看看会不会寄/kel

#include<bits/stdc++.h>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define ll long long
//#define int long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define cl(f,x) memset(f,x,sizeof(f))
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
using namespace std;
const int N=1e5+5;
int head[N],len;
struct node {
	int to,nxt;
}; node edge[N<<1];
void add_edge(int u,int v) {
	edge[++len]={v,head[u]}; head[u]=len;
}
int f[N];
void dfs(int u,int fa) {
	f[u]=fa;
	for(int i=head[u];i;i=edge[i].nxt) {
		int v=edge[i].to;
		if(v!=fa)
			dfs(v,u);
	}
}
__int128 calc(__int128 x) {
	return x*(x+1)/2;
}
const __int128 awa=1;
__int128 calc(__int128 a,__int128 b,__int128 c) {
	if(c<0) {
		__int128 x=max(awa,min(a+1,(__int128)ceil(1.0*(1-b)/c)));
		return (x-1)*b+calc(x-1)*c+(a-x+1);
	} else if(c==0)
		return a*b;
	else {
		__int128 x=max(awa,min(a+1,(__int128)ceil(1.0*(1-b)/c)));
		return (x-1)+(a-x+1)*b+(calc(a)-calc(x-1))*c;
	}
}
ll a[N],b[N],c[N];
int p[N],t[N],n;
bool used[N];
int update(int u) {
	if(used[u])
		return 0;
	used[u]=true;
	if(f[u])
		return update(f[u])+1;
	return 1;
}
bool check(int x) {
	rep(i,1,n) {
		used[i]=false;
		__int128 val=calc(x,b[i],c[i]);
		if(val<a[i])
			return false;
		int l=1,r=x,ans=-1;
		while(l<=r) {
			int mid=(l+r)>>1;
			if(val-calc(mid-1,b[i],c[i])>=a[i])
				ans=mid,l=mid+1;
			else
				r=mid-1;
		}
		t[i]=ans;
	}
	sort(p+1,p+n+1,[](const int &x,const int &y) {
		return t[x]<t[y];
	});
	int res=0;
	rep(i,1,n) {
		res+=update(p[i]);
		if(res>t[p[i]])
			return false;
	}
	return true;
}
ll read() {
	ll x=0; char ch=getchar();
	while(!isdigit(ch))
		ch=getchar();
	while(isdigit(ch))
		x=x*10+ch-48,ch=getchar();
	return x;
}
int main() {
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	n=read();
	rep(i,1,n)
		a[i]=read(),b[i]=read(),c[i]=read(),p[i]=i;
	rep(i,2,n) {
		int u=read(),v=read();
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs(1,0);
	int l=n,r=1e9,ans=1e9;
	while(l<=r) {
		int mid=(l+r)>>1;
		if(check(mid))
			r=mid-1,ans=mid;
		else
			l=mid+1;
	}
	printf("%d\n",ans);
	return 0;
}
2023/10/21 21:01
加载中...