求助:CSP-S T4 订正代码 75pts(AC+WA)
  • 板块学术版
  • 楼主Mr_罗
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/23 15:53
  • 上次更新2023/11/2 11:43:20
查看原帖
求助:CSP-S T4 订正代码 75pts(AC+WA)
365751
Mr_罗楼主2023/10/23 15:53

RT,谢谢。

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define LL __int128_t
#define ld long double

const int N = 100010, M = 200010;
int n;
LL m;
int hd[N], ed[M], nt[M], cnt = 1;
LL a[N], b[N], c[N], d[N], s[N];

void add_edge (int u, int v)
{
    ed[++cnt] = v;
    nt[cnt] = hd[u];
    hd[u] = cnt;
}

LL solve (LL a, LL b, LL c)
{
    LL x;
    if (c == 0)
        x = (ld) m + 1 - ((ld) a / b);
    else if (c > 0 || (c < 0 && b + m * c >= 1))
    {
        LL X = 2 * m * b + 2 * b - 2 * a + m * m * c + m * c;
        x = ((c - 2 * b) + sqrt ((ld) (2 * b - c) * (2 * b - c) + (ld) 4 * c * X)) / (ld) (2 * c);
    }
    else
    {
        LL y = (ld) (1 - b) / c;
        if (m - y >= a)
            x = m + 1 - a;
        else
        {
            LL X = 2 * y * b + 2 * b - 2 * (a + y - m) + y * y * c + y * c;
            x = ((c - 2 * b) + sqrt ((ld) (2 * b - c) * (2 * b - c) + (ld) 4 * c * X)) / (ld) (2 * c);
        }
    }
    return x;
}

void dfs (int u, int ft)
{
    s[u] = 1000000000;
    for (int i = hd[u]; i; i = nt[i])
    {
        int v = ed[i];
        if (v == ft)
            continue;
        dfs (v, u);
        s[u] = min (s[u], s[v] - 1);
    }
    s[u] = min (s[u], d[u]);
}

bool check()
{
    for (int i = 1; i <= n; i++)
        d[i] = solve (a[i], b[i], c[i]);
    dfs (1, 0);
    return s[1] >= 1;
}

LL BSch()
{
    LL l = n, r = 1000000000, ans = -1;
    while (l <= r)
    {
        m = l + r >> 1;
        if (check())
        {
            ans = m;
            r = m - 1;
        }
        else
            l = m + 1;
    }
    return ans;
}

int main()
{
    scanf ("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        ll x, y, z;
        scanf ("%lld%lld%lld", &x, &y, &z);
        a[i] = x;
        b[i] = y;
        c[i] = z;
    }
    for (int i = 1; i < n; i++)
    {
        int u, v;
        scanf ("%d%d", &u, &v);
        add_edge (u, v);
        add_edge (v, u);
    }
    printf ("%lld\n", (ll) BSch());
    return 0;
}
/*

a: b c

c=0:
(m-x+1)b>=a
mb-xb+b>=a
xb<=mb+b-a
x<=(mb+b-a)/b
x<=m+1-(a/b)

c>0:
2(m-x+1)b+c(x+m)(m-x+1)>=2a
2mb-2xb+2b+c(xm-xx+x+mm-xm+m)>=2a
-2xb+c(-xx+x+mm+m)>=2a-2mb-2b
-2xb-xxc+xc+mmc+mc>=2a-2mb-2b
2xb+xxc-xc<=2mb+2b-2a+mmc+mc
cxx+(2b-c)x<=X=2mb+2b-2a+mmc+mc
cxx+(2b-c)x-X<=0
x1<=x<=x2

c<0:
mc+b>=1 -> c>0
mc+b<1:
find max{y} s.t. yc+b>=1
    yc>=1-b
    y<=(1-b)/c
day[x,y]>=1 [y+1,m]<1->1
2(y-x+1)b+c(x+y)(y-x+1)>=2a+2y-2m
2yb-2xb+2b+c(xy-xx+x+yy-xy+y)>=2a+y-m
-2xb-cxx+cx+cyy+cy>=2a+y-m-2yb-2b
cxx+2xb-cx<=m-y-2a+2yb+2b+cyy+cy
x1<=x<=x2

m-x+1>=a
x<=m+1-a

*/
2023/10/23 15:53
加载中...