社区讨论

提高组T4

学术版参与者 4已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo305jvc
此快照首次捕获于
2023/10/23 22:37
2 年前
此快照最后确认于
2023/11/02 11:38
2 年前
查看原帖
rt,以下这份代码在洛谷会WA ON #19
CPP
#include<bits/stdc++.h>
using namespace std;
int n,u,v,l,r;
long long a[100005],b[100005],c[100005],d[100005],minn[100005],ans,cnt;
vector<int>g[100005];
bool vis[100005];
bool checkp(int st,int i,int ed){
	if(b[i]+c[i]*ed>=1||c[i]>=0)
		return c[i]*(1ll*(ed+st)*(ed-st+1)/2)+b[i]*(ed-st+1)>=a[i];
	int s=b[i]/(-c[i]);
	if(b[i]%(-c[i])==0)
		s--;
	return b[i]*(s-st+1)+c[i]*(1ll*(s+st)*(s-st+1)/2)+ed-s>=a[i];
}
long long get(int i,long long sum){
	long long l=1,r=1e5,ans=0;
	while(l<=r){
		int mid=l+r>>1;
		if(checkp(mid,i,sum))
			ans=mid,l=mid+1;
		else
			r=mid-1;
	}
	return ans;
}
struct node{
	int x,idx;
	bool operator<(const node t)const{
		return x>t.x;
	}
};
void dfs(int u,int fa=-1){
	minn[u]=d[u];
	for(auto &&v:g[u])
		if(v!=fa){
			dfs(v,u);
			minn[u]=min(minn[u],minn[v]);
		}
}
bool check(long long sum){
	cnt=0;
	memset(vis,false,sizeof vis);
	memset(minn,0x3f,sizeof minn);
	for(int i=1;i<=n;i++)
		d[i]=get(i,sum);
	dfs(1);
	priority_queue<node>q;
	q.push({1,1});
	vis[1]=true;
	while(!q.empty()){
		node cur=q.top();
		q.pop();
		cnt++;
		if(cur.x<cnt)
			return false;
		for(auto &&v:g[cur.idx])
			if(!vis[v])
				q.push({minn[v],v}),vis[v]=true;
	}
	return true;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld%lld%lld",a+i,b+i,c+i);
	for(int i=1;i<n;i++)
		scanf("%d%d",&u,&v),g[u].push_back(v),g[v].push_back(u);
	l=1,r=1000000007;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}else
			l=mid+1;
	}
	printf("%lld",ans);
	return 0;
}

回复

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

正在加载回复...