求助CSP-S2023 T4
  • 板块学术版
  • 楼主Lgx_Q
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/24 13:22
  • 上次更新2023/10/24 16:36:09
查看原帖
求助CSP-S2023 T4
375953
Lgx_Q楼主2023/10/24 13:22
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define mkp make_pair
//#define __int128 ll
using namespace std;
const ll maxn=2e5+10;
ll n,a[maxn],b[maxn],c[maxn],u,v,d[maxn],lo,hi,mid,head[maxn],tot,son[maxn],top[maxn],siz[maxn],fa[maxn],dep[maxn],tid;
ll id[maxn],dfn[maxn],g[maxn];
struct edge
{
	ll v,nxt;
}e[maxn];
void ins(ll u,ll v)
{
	e[++tot]=(edge){v,head[u]};
	head[u]=tot;
}
ll find(ll x)
{
	if(g[x]==x) return x;
	return g[x]=find(g[x]);
}
ll Getd(ll a,ll b,ll c,ll t)
{
	if(c==0) return max(0ll,t-(a-1)/b);
	ll l=1, r=t;
	if(c>0)
	{
		while(l<=r)
		{
			ll Mid=l+r>>1;
			ll tr=(Mid+t)*(t-Mid+1)>>1;
			if((t-Mid+1)*b+((__int128)c*tr)>=a) l=Mid+1;
			else r=Mid-1;
		}
		return r;
	}
	else
	{
		ll p=(b-1)/(-c); p=min(p,t);  p=max(p,0ll);
		while(l<=r)
		{
			ll Mid=l+r>>1;
			__int128 res=0;
			if(b+c*Mid<=1)
			{
				res=t-Mid+1;
			}
			else
			{
				ll tr=(Mid+p)*(p-Mid+1)>>1;
				res=b*(p-Mid+1)+((__int128)c*tr);
				res+=t-p;
			}
			if(res>=a) l=Mid+1;
			else r=Mid-1;
		}
		return r;
	}
}
void dfs(ll u,ll f)
{
	fa[u]=f; dep[u]=dep[f]+1; siz[u]=1;
	for(ll i=head[u];i;i=e[i].nxt)
	{
		ll v=e[i].v;
		if(v!=f)
		{
			dfs(v,u);
			siz[u]+=siz[v];
			if(siz[v]>siz[son[u]]) son[u]=v;
		}
	}
}
ll upd(ll u)
{
	ll res=0;
	while((u=find(u))!=n+1)
	{
		++res;
		g[u]=fa[u];
	}
	return res;
}
bool cmp(ll x,ll y)
{
	return d[x]<d[y];
}
bool check(ll mid)
{
	for(ll i=1;i<=n;i++)
	{
		d[i]=Getd(a[i],b[i],c[i],mid);
		id[i]=i;
	}
	for(ll i=1;i<=n+1;i++) g[i]=i;
	tid=0;
	sort(id+1,id+1+n,cmp);
	ll cnt=0;
	for(ll i=1;i<=n;i++)
	{
		ll u=id[i];
		ll tmp=upd(u);
		if(cnt+tmp>d[u]) return false;
		cnt+=tmp;
	}
	return true;
}
void rd(ll &x)
{
	char c; ll f;
	while(!isdigit(c=getchar())) ;
	if(c=='-') f=-1;
	else f=1, x=c-'0';
	while(isdigit(c=getchar())) x=x*10+c-'0';
	x*=f;
}
int main()
{
//	freopen("tree.in","r",stdin);
//	freopen("tree.out","w",stdout);
	rd(n);
	for(ll i=1;i<=n;i++)
	{
		rd(a[i]); rd(b[i]); rd(c[i]); d[i]=-1;
	}
	for(ll i=1;i<n;i++)
	{
		rd(u); rd(v);
		ins(u,v); ins(v,u);
	}
	dfs(1,n+1);
	ll lo=1, hi=1e9;
	ll ans=0, kc=0;
	while(lo<=hi)
	{
		ll mid=lo+hi>>1;
		if(check(mid)) hi=mid-1;
		else lo=mid+1;
	}
	printf("%lld",lo);
	return 0;
}

WA85pts,盯代码盯了几万年了,根本发现不了错误。

求求好心人帮忙看看。

2023/10/24 13:22
加载中...