惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
B
Blog RSS Feed
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
量子位
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园_首页
IT之家
IT之家
V
Visual Studio Blog
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
I
InfoQ
D
Docker
V
V2EX

某岛

AtCoder Beginner Contest 409 Luogu P5325. 【模板】Min_25 筛 UOJ #188. 【UR #13】Sanrd AtCoder Beginner Contest 371 AtCoder Beginner Contest 369 RPGMaker 2k3 百科 OneShot 的考古 2024“开创拓芯”游戏创享节的相关记录 CJ 回来后的戒断反应 Luogu P10221. [省选联考 2024] 重塑时光 wqs 二分 歌唱王国 Lean 相关 BZOJ 3153. Sone1 The 2023 ICPC World Finals Luxor 新巴别塔 Sora 的想象与思考 Facebook Hacker Cup 2023 Round 1 AtCoder Beginner Contest 322 LLaMA 2 相关 HuggingFace AI Game Jam ACL 2023 Trans 相关… Luogu P2053. [SCOI2007] 修车 Luogu P1973. [NOI2011] NOI 嘉年华 Luogu P1933. [NOI2010] 旅行路线 Luogu P1954. [NOI2010] 航空管制 Luogu P2048. [NOI2010] 超级钢琴 Luogu P2046. [NOI2010] 海拔 Luogu P3227. [HNOI2013] 切糕
Luogu P5308 [COCI2018-2019#4] Akvizna
2024-06-18 · via 某岛

wqs 二分显然,最多每轮得分是 1,lambda 上限可置为 1。
直接 dp 复杂度 O(n2) 可以拿 34 分。

const int N = int(1e5) + 9;
pair<DB, int> f[N];
int q[N], cz, op;
int n, k;

bool ok(DB lambda) {
    cz = 0, op = 0; q[cz] = 0; REP_1(i, n) {
        auto g = [&](int j){
            return MP(f[j].fi + (DB)(i-j)/i - lambda, f[j].se + 1);
        };
        f[i] = {0, 0};
        REP(j, i) checkMax(f[i], g(j));
    }
    return f[n].se <= k;
}

DB gao() {
    DB l = 0, r = 1;
    DO(133) {
        DB m = (l + r) / 2;
        ok(m) ? r = m : l = m;
    }
    ok(l);
    return f[n].fi + l*k;
}

int main() {

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif
    RD(n, k);
    printf("%.9f\n", gao());
}

进一步观察,显然可以斜率 dp,复杂度 O(n)。

const int N = int(1e5) + 9;
pair&lt;DB, int&gt; f[N];
int q[N], cz, op;
int n, k;

// f[j].fi - j/i
// b = y - kx
// f[i] , f[j], 1/i, j

DB det(DB x1, DB y1, DB x2, DB y2){
    return x1<em>y2 - x2</em>y1;
}

int dett(int a, int b, int c) {
    DB t = det(b-a, f[b].fi-f[a].fi, c-a, f[c].fi-f[a].fi);
    return t &lt; 0 ? -1 : t &gt; 0;
}

bool ok(DB lambda) {
    cz = 0, op = 0; q[cz] = 0; REP_1(i, n) {
        auto g = [&amp;](int j){
            return MP(f[j].fi + (DB)(i-j)/i - lambda, f[j].se + 1);
        };
        while (cz &lt; op &amp;&amp; g(q[cz]) &lt;= g(q[cz+1])) ++cz;
        f[i] = g(q[cz]);
        while (cz &lt; op &amp;&amp; dett(q[op-1], q[op], i) &gt; 0) --op;
        q[++op] = i;
    }
    return f[n].se &lt;= k;
}

DB gao() {
    DB l = 0, r = 1;
    DO(133) {
        DB m = (l + r) / 2;
        ok(m) ? r = m : l = m;
    }

<pre><code>ok(l);
return f[n].fi + l*k;
</code></pre>

}

int main() {

#ifndef ONLINE_JUDGE
    freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);
    //freopen(&quot;out.txt&quot;, &quot;w&quot;, stdout);
#endif
    RD(n, k);
    printf(&quot;%.9f\n&quot;, gao());
}

似乎也可以直接二分导数?

Posted by xiaodao
Category: 日常