萌新95pts求助
查看原帖
萌新95pts求助
368791
FL_sleake楼主2024/5/19 15:04

WA on #15,不知道为啥啊

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[100010],b[100010],c[100010],u[100010],v[100010],fa[100010];
vector<int> G[100010];
int nd[100010],vis[100010];
void C_close(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
}
void dfs(int u,int p){
	fa[u]=p;
	for(int v:G[u]) if(v!=p) dfs(v,u);
}
bool ck(int st,int ed,int i){
	if(c[i]==0) return ((__int128)(ed-st+1)*max(b[i],1ll))>=a[i];
	if(c[i]>0){
		if(b[i]+(__int128)st*c[i]>=1) return (__int128)((ed-st+1)*b[i]+(__int128)(ed-st+1)*(__int128)(st+ed)/2*c[i])>=a[i];
		if(b[i]+(__int128)ed*c[i]<=1) return (__int128)(ed-st+1)>=a[i];
		int nw=(__int128)(1-b[i])/c[i]-1;
		while(b[i]+(__int128)nw*c[i]<1) nw++;
		return (__int128)((nw-st)+(__int128)(ed-nw+1)*b[i]+(__int128)(ed-nw+1)*(__int128)(nw+ed)/2*c[i])>=a[i];
	}else{
		if(b[i]+(__int128)ed*c[i]>=1) return (__int128)((ed-st+1)*b[i]+(__int128)(ed-st+1)*(__int128)(st+ed)/2*c[i])>=a[i];
		if(b[i]+(__int128)st*c[i]<=1) return (__int128)(ed-st+1)>=a[i];
		int nw=(__int128)(1-b[i])/c[i]+1;
		while(b[i]+(__int128)nw*c[i]<1) nw--;
		return (__int128)((ed-nw)+(__int128)(nw-st+1)*b[i]+(__int128)(nw-st+1)*(__int128)(nw+st)/2*c[i])>=a[i];
	}
}
int calc(int i,int ed){
	int l=1,r=ed,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(ck(mid,ed,i)) l=mid+1,ans=mid;
		else r=mid-1;
	}
	return ans;
}
void DFS(int u,int p){
	int Min=0x3f3f3f3f3f3f3f3f;
	for(int v:G[u]){
		if(v==p) continue;
		DFS(v,u);
		Min=min(Min,nd[v]);
	}
	int cnt=0;
	for(int v:G[u]) if(nd[v]==Min&&v!=p) cnt++;
	nd[u]=min(nd[u],Min-cnt);
}
bool check(int x){
	for(int i=1;i<=n;i++){
		nd[i]=calc(i,x);
		if(nd[i]<1) return 0;
	}
	DFS(1,0);
	for(int i=1;i<=n;i++) if(nd[i]<1) return 0;
	return 1;
}
signed main(){
	C_close();
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
	for(int i=1;i<=n-1;i++){
		cin>>u[i]>>v[i];
		G[u[i]].push_back(v[i]);
		G[v[i]].push_back(u[i]);
	}
	dfs(1,0);
	int l=1,r=1e9,ans=1;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)) r=mid-1,ans=mid;
		else l=mid+1;
	}
	cout<<ans<<endl;
	return 0;
}
/*
20
8711196809241382 866431622 -26
12338190 56486490 -751942578
1592174753724827 319217044 -32
4992314209553308 484821039 -13
10779700847116122 404833961 76
2403722922189903 293525604 -16
873521103768048 347197602 -69
10178465446375981 769434836 9
2900422388953204 637228359 -70
53813051603 668492735 -3406898
6584127210092267 422594092 18
416482361699033290 76338741 734917963
157991653963 142394644 -63517
12338184 880023927 -818649801
686538639348 7947607 -46
176353160 892215477 -364100257
12338185 3978020 -287788818
6279818338239579 70967629 71
7585540542175642 688830826 -12
455266095398331618 290359314 633276435
1 2
12 3
15 4
15 5
17 6
1 7
14 8
19 9
2 10
4 11
13 12
15 13
5 14
1 15
1 16
5 17
16 18
15 19
15 20
*/
2024/5/19 15:04
加载中...