社区讨论

95分求助,看了几个帖子,机房场切大佬没调出

P9755[CSP-S 2023] 种树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@loctf6zr
此快照首次捕获于
2023/10/30 19:27
2 年前
此快照最后确认于
2023/11/02 10:39
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,a[N],b[N],c[N],d[N],h[N],tot,fa[N],p[N],cnt;
struct node{
	int id,day;
	inline bool operator < (const node &X)const{
		return day<X.day;
	}
}mx[N];
struct edge{int v,ne;}e[N<<1];
inline void add(int u,int v){
	e[++tot]={v,h[u]},h[u]=tot;
}
void dfs(int u){
	for(int v,i=h[u];i;i=e[i].ne){
		v=e[i].v;
		if(v==fa[u])continue;
		fa[v]=u,dfs(v);
	}
}
inline int find(int i,__int128 x){
	int l=1,r=x,mid,ret=-1;
	if(!d[i]){
		while(l<=r){
			mid=l+r>>1;
			if(b[i]*(x-mid+1)+c[i]*(x-mid+1)*(x+mid)/2>=a[i])
				l=mid+1,ret=mid;
			else r=mid-1;
		}
	}
	else{
		while(l<=r){
			mid=l+r>>1;
			if(mid>=d[i]){
				if(x-mid+1>=a[i])
					l=mid+1,ret=mid;
				else r=mid-1;
			}
			else{
				if(x-d[i]+1+b[i]*(d[i]-mid)+(__int128)c[i]*(d[i]-mid)*(mid+d[i]-1)/2>=a[i])
					l=mid+1,ret=mid;
				else r=mid-1;
			}
		}
	}
	return ret;
}
void add(int u){
	if(!u||p[u])return;
	add(fa[u]);
	p[u]=++cnt;
}
inline bool check(int x){
	cnt=0;
	for(int i=1;i<=n;++i){
		mx[i]={i,find(i,x)},p[i]=0;
		if(!~mx[i].day)return 0;
	}
	sort(mx+1,mx+n+1);
	for(int id,i=1;i<=n;++i){
		id=mx[i].id;
		if(!p[id])add(id);
		if(p[id]>mx[i].day)return 0;
	}
	return 1;
}
inline int Ceil(int x,int y){return x/y+(x%y!=0);}
signed main(){
	// freopen("tree.in","r",stdin);
	// freopen("tree.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i]>>b[i]>>c[i];
		if(c[i]<0)d[i]=Ceil(b[i]-1,-c[i]);
	}
	for(int u,v,i=1;i<n;++i){
		cin>>u>>v;
		add(u,v),add(v,u);
	}
	dfs(1);
	int l=0,r=1e9,mid,ans=0;
	while(l<=r){
		mid=l+r>>1;
		if(check(mid))
			r=mid-1,ans=mid;
		else l=mid+1;
	}
	cout<<ans<<endl;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...