AC代码但是求调,顺便请求加强数据
查看原帖
AC代码但是求调,顺便请求加强数据
726899
Ray1楼主2023/10/29 21:25

赛时代码洛谷民间数据 95,小图灵只有 25,但是官方数据 AC 了。

不知道哪里写挂了,有没有好心人帮我看看。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+2;
int n,lim[N],u,v,l,r,x,a[N],b[N],c[N],d[N],w[N],son[N],fa[N];
vector<int>g[N];
__int128 uuse(int i,int x){
	int y=min(x,lim[i]);
	return(__int128)(1+y)*y/2*c[i]+y*b[i]+max(0ll,x-lim[i]);
}
bool check(){
	for(int i=1;i<=n;i++){
		__int128 uuuu=uuse(i,x);
		int l=0,r=x+1;
		while(r-l>1){
			int y=l+r>>1;
			if(uuuu-uuse(i,y)>=a[i])l=y;
			else r=y;
		}
		if(uuuu-uuse(i,l)<a[i])return 0;
		w[i]=l;
		d[i]=son[i];
	}
	priority_queue<pair<int,int>>q;
	for(int i=1;i<=n;i++)if(!d[i])q.push({w[i],i});
	for(int i=n;i;i--){
		int u=q.top().second;
		if(q.top().first+1<i)return 0;
		q.pop();
		if(!--d[fa[u]])q.push({w[fa[u]],fa[u]});
	}
	return 1;
}
void dfs(int u,int f){for(int v:g[u])if(v!=f)++son[u],fa[v]=u,dfs(v,u);}
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];
	for(int i=1;i<n;i++)cin>>u>>v,g[u].push_back(v);
	dfs(1,0);
	for(int i=1;i<=n;i++){
		l=0,r=(int)1e9+1;
		while(r-l>1){
			x=l+r>>1;
			if(b[i]+x*c[i]>1)l=x;
			else r=x;
		}
		lim[i]=l;
	}
	l=n-1,r=1e9;
	while(r-l>1){
		x=l+r>>1;
		if(check())r=x;
		else l=x;
	}
	cout<<r;
}
2023/10/29 21:25
加载中...