社区讨论

求教 wqs 二分 check 内判断的差别

P6246[IOI 2000] 邮局 加强版 加强版参与者 4已保存回复 25

讨论操作

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

当前回复
25 条
当前快照
1 份
快照标识符
@mdqry5es
此快照首次捕获于
2025/07/31 10:27
7 个月前
此快照最后确认于
2025/11/05 00:55
4 个月前
查看原帖
如果我二分内判断 g[n] <= p,二分外 l = mid + 1,ret = mid,那么就过了。
CPP
il bool check__(int val) {
    hh = 1; tt = 0; f[0] = g[0] = 0;
    rep(i,1,n) {
        // cerr << hh << " " << tt << endl;
        while (hh <= tt && check(q[hh - 1],q[hh]) <= i) ++ hh;
        int j = q[hh - 1];
        f[i] = f[j] + calc(j + 1,i) - val; g[i] = g[j] + 1;
        while (hh <= tt && check(q[tt - 1],q[tt]) >= check(q[tt],i)) -- tt;
        q[++ tt] = i;
    }
    return g[n] <= p;
}

il void solve() {
    //------------code------------
    read(n,p);
    rep(i,1,n) read(a[i]);
    sort(a + 1,a + n + 1);
    rep(i,1,n) s[i] = s[i - 1] + a[i];
    int l = -1e7,r = 0,ret = 0;
    while (l <= r) {
        int mid = l + r >> 1;
        if (check__(mid)) l = mid + 1,ret = mid;
        else r = mid - 1;
    }
    check__(ret);
    write(f[n] + p * ret,'\n');
    return ;
}
但是如果我反过来,二分里判断 g[n] >= p,二分外移动 r = mid - 1,ret = mid,那么就会 wa 20pts.
不理解为什么。求教。

回复

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

正在加载回复...