问一下这个代码为什么会浮点异常
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/22 09:38
  • 上次更新2023/11/2 12:00:52
查看原帖
问一下这个代码为什么会浮点异常
197648
封禁用户楼主2023/10/22 09:38
#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &x)
{
	static int c,p;
	c = getchar(),p = 1,x = 0;
	while(c < 48||c > 57)
	{
		if(c == 45) p = -1;
		c = getchar();
	}
	while(48 <= c&&c <= 57)
	{
		x = (x<<3)+(x<<1)+(c^48);
		c = getchar();
	}
	x *= p;
}
template<typename T>inline void write(T x)
{
	static int c[40],len = 0;
	if(x < 0) putchar(45),x = -x;
	if(!x) putchar(48);
	while(x)
	{
		c[++len] = (x%10)^48;
		x /= 10;
	}
	while(len) putchar(c[len--]);
}
#define F(i,a,b) for(register int i = a;i <= b;++i)
#define D(i,a,b) for(register int i = a;i >= b;--i)
#define ull unsigned long long
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define N 100010
constexpr __uint128_t I = 1;
int head[N],nxt[N<<1],to[N<<1],cnt = 0;
inline void add(int u,int v)
{
	nxt[++cnt] = head[u];
	head[u] = cnt;
	to[cnt] = v;
}
int n,d[N],s[N],f[N],dep[N],arr[N],m = 0,top;
ll a[N],b[N],c[N],B,C,lim;
void dfs(int u,int fa)
{
	dep[u] = dep[fa] + 1,f[u] = fa;
	for(register int i = head[u];i;i = nxt[i])
	{
		int v = to[i];
		if(v == fa) continue;
		dfs(v,u);
	}
	arr[++m] = u;
}
inline bool fun(int x)
{
	if(C*top+B >= 1) return B*(top-x+1) + I*C*(x+top)*(top-x+1)/2 >= lim;
	if(C*x+B >= 1) 
	{
		int t = (B-1)/(-C);
		return B*(t-x+1) + I*C*(x+t)*(t-x+1)/2+(top-t) >= lim;
	}
	return top-x+1 >= lim;
}
bool check(int x)
{
	F(i,1,n)
	{
		if(!c[i]) 
		{
			d[i] = x - (a[i] - 1) / b[i];
			d[i] = min(d[i],n);
			if(d[i] < dep[i]) return 0;
			continue;
		}
		top = x,B = b[i],C = c[i],lim = a[i];
		if(!fun(dep[i])) return 0;
		if(fun(n)) 
		{
			d[i] = n;
			continue;
		}
		int l = dep[i],r = n,mid;
		while(l <= r)
		{
			mid = (l + r) >> 1;
			if(fun(mid)) l = mid + 1;
			else r = mid - 1;
		} 
		d[i] = r;
	}
	F(i,1,n) 
		if(f[arr[i]])
			d[f[arr[i]]] = min(d[f[arr[i]]],d[arr[i]] - 1);
	if(d[1] < 1) return 0;
	memset(s,0,(n+5)<<2);
	F(i,1,n) ++s[d[i]];
	F(i,1,n) 
	{
		s[i] += s[i-1];
		if(s[i] > i) return 0;
	}
	return 1;
}
int main()
{
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	read(n);
	F(i,1,n) read(a[i]),read(b[i]),read(c[i]);
	F(i,1,n-1)
	{
		int u,v;
		read(u),read(v);
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	int l = n,r = 1e9,mid;
	while(l <= r)
	{
		mid = (l + r) >> 1;
		if(check(mid)) r = mid - 1;
		else l = mid + 1;
	}
	write(l);
	return 0;
}

CSP-S T4 洛谷 95 pts。有一个点浮点异常。

找到问题悬关。

2023/10/22 09:38
加载中...