CSP-ST4求调教
  • 板块学术版
  • 楼主_XHY20180718_
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/10/21 23:59
  • 上次更新2023/10/22 11:31:56
查看原帖
CSP-ST4求调教
399475
_XHY20180718_楼主2023/10/21 23:59

这个蒟蒻由于没在考场上遇到过大模拟而被T3爆杀导致T4没时间调。

警钟长鸣。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,fa[N],f[N],day;
int a[N],b[N],c[N],d[N];
int head[N],ei,ans;
struct edge{
	int v,nxt;
}egs[N<<1];
struct node{
	int w,u;
	bool operator<(const node &t)
	const {return w>t.w;}
};
inline void add(int u,int v){
	egs[++ei]=(edge){v,head[u]};head[u]=ei;
}
inline int ff(int x){return x*(x+1)/2;}
inline int qry(int i,int y,int res){
	int x=(1-b[i])/c[i];
	if(c[i]>0)
		if(x>=y)return (x-y+1)+(res-x)*b[i]+(ff(res)-ff(x))*c[i];
		else return (res-y+1)*b[i]+(ff(res)-ff(y-1))*c[i];
	else 
		if(x>=y)return (res-x)+(x-y+1)*b[i]+(ff(x)-ff(y-1))*c[i];
		else return res-y+1;
}
inline void dfs(int u){
	f[u]=d[u];
	for(int i=head[u];i;i=egs[i].nxt){
		const int v=egs[i].v;
		if(fa[u]==v)continue;fa[v]=u;
		f[u]=min(f[u],f[v]-1);dfs(v);
	}
}
inline bool calc(int res){day=0;
	day=res-n;
	for(int i=1; i<=n; ++i){
		int l=1,r=res,mid;
		while(l<r){
			mid=l+(r-l>>1);
			if(qry(i,mid,res)<a[i])r=mid;
			else d[i]=mid,l=mid+1;
		}
	}dfs(1);
	priority_queue<node>qu;
	qu.push((node){f[1],1});
	while(!qu.empty()){
		int u=qu.top().u;qu.pop();++day;
		if(f[u]<day)return 0;
		for(int i=head[u]; i; i=egs[i].nxt){
			const int v=egs[i].v;
			if(v==fa[u])continue;
			qu.push((node){f[v],v});
		}
	}return 1;
}
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;int u,v;
	for(int i=1; i<=n; ++i)
		cin>>a[i]>>b[i]>>c[i];
	for(int i=1; i<n; ++i)
		cin>>u>>v,add(u,v),add(v,u);
	int l=1,r=1e9,mid;
	while(l<r){
		mid=l+(r-l>>1);
		if(!calc(mid))l=mid+1;
		else ans=r=mid;
	}
	cout<<ans; 
	return 0;
}
2023/10/21 23:59
加载中...