首页 > 其他分享 >CF1890D Doremy's Connecting Plan

CF1890D Doremy's Connecting Plan

时间:2023-11-06 18:58:13浏览次数:46  
标签:连边 连通 不等式 int Doremy ge Connecting Plan 贪心

或许赛时根本不需要证明贪心的正确性。

我们发现 \(c\) 对于问题的影响不大,我们可以将每个 \(a_i\) 除以 \(c\),就转化为了 \(c=1\) 的情况。

一个自然的贪心是用 \(1\) 作为中心点去连接其他的所有点,这需要两条结论保证其正确性:

结论一: 如果当前图中还可以连边,点 \(1\) 就还可以与其他点连边。

假设我们能够在点 \(i,j \ne 1\) 之间连边的话,有以下不等式成立 \(S_i+S_j\ge i\cdot j\ge i+j\),其中 \(S_i\) 表示点 \(i\) 所属连通块的点权和(第二个不等号可以通过简单的数学推导得出)。此时必有 \(S_i\ge i\) 或者 \(S_j\ge j\)(反证法,若 \(S_i<i\) 且 \(S_j<j\) 则 \(S_i+S_j<i+j\),矛盾)。不妨设 \(S_i\ge i\),有 \(S_i+S_1\ge i\cdot 1\),所以 \(1,i\) 之间一定可以连边。

结论二: 以点 \(1\) 为中心点连边,不会导致“本来能连上的点”连不上了。

假如点 \(i,j\) 之间能连边,由结论一得,必有 \(1,i\) 或 \(1,j\) 之间能连边,则任意点都能与 \(1\) 间接连通,但能否直接连通呢?难以证明。

就本题而言,我们继续贪心地认为,只要 \(1\) 连接起来的连通块足够大,点权和就能够保证不等式的成立。所以可以把节点按照 \(S_i-i\) 从大到小排序,先易后难(显然 \(S_i-i\) 大时不等式 \(S_i+S_1\ge i\cdot 1\) 更容易成立),逐一与点 \(1\) 结合,如果不能结合则认为无法连通,输出 NO

下面是 AC 代码:

void solve() {
    int n;
    i64 c;
    cin >> n >> c;
    cin >> $( a, n );
    iota( all( b, n ), 1 );
    sort( all( b, n ), [&]( int x, int y ) {
        return a[x] - x * c > a[y] - y * c;
    } );
    i64 s = a[1];
    forn( i, n ) {
        if( b[i] == 1 ) ctn;
        if( s + a[b[i]] < b[i]*c ) {
            cout << "No\n";
            return;
        }
        s += a[b[i]];
    }
    cout << "Yes\n";
    clear();
}

THE END

标签:连边,连通,不等式,int,Doremy,ge,Connecting,Plan,贪心
From: https://www.cnblogs.com/th19/p/17813381.html

相关文章

  • MySQL学习(11)使用EXPLAN查看执行计划
    前言 MySQL查询优化起生成的执行计划是什么,可以通过EXPLAIN命令查看。执行计划在SELECT、DELETE、INSERT、REPLACE以及UPDATE语句前面加上EXPLAIN,可以通过记录的形式输出这条语句的执行计划。EXPLAINSELECT*FROMsingle_table; 列名描述id每个SELECT关键字......
  • [NewStarCTF WEEK5] pwn-planet 详解
    这道题目更多是考pwner的逆向功底(虽然程序逻辑也不是非常复杂=_=)老规矩,先checksec查看程序保护全开看一下main函数__int64__fastcallmain(inta1,char**a2,char**a3){unsignedintv4;//eaxchars1[88];//[rsp+20h][rbp-60h]BYREFunsigned__int64v6;......
  • dotnet 探究 SemanticKernel 的 planner 的原理
    在使用SemanticKernel时,我着迷于SemanticKernel强大的plan能力,通过plan功能可以让AI自动调度拼装多个模块实现复杂的功能。我特别好奇SemanticKernel里的planner的原理,好奇底层具体是如何实现的。好在SemanticKernel是完全开源的,通过阅读源代码,我理解了SemanticK......
  • Codeforces Round 906 (Div. 2) Doremy's Drying Plan E1.&E2
    传送门先考虑\(E1\)只需要删除两条线使得不被覆盖的点数最多。观察到点数只有\(200000\)那么我们完全可以先将被至少\(3\)条线覆盖的点删掉。考虑枚举一条线,枚举这条线覆盖的点寻找另外一条线覆盖这些点中的最大值,然后再找没覆盖这些点之外的线的最大值即可。复杂度容易证明......
  • 飞行模拟机—X-Plane的目录结构
    你的X-Plane打开时是否需要好几分钟时间?是否存在数据库在FMS里总是看不到或是版本不对的问题?有没有新建好的机场在软件里找不到的问题?如果有这些问题,说明你需要了解一下X-Plane的目录结构,从而解决上述问题。简单来说,造成X-Plane启动缓慢的主要原因通常是机型种类加载过......
  • 分享一个项目:`learning_go_plan9_assembly`, 学习 golang plan9 汇编
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯近期在学习golangplan9汇编,总算基本做到了手写汇编,并整理了很多笔记。plan9汇编的资料少,难学,难用。可能也有想学习汇编的人会遇到与我一样的问题。于是把笔记进......
  • idea plantuml 使用技巧
    实现的关系 A实现接口BA..|>B继承的关系A继承了BA--|>B依赖关系:A使用BA..>B聚合关系(整体与部分:可以分割,创建了整体,部分可以在后面创建 类似于人和收) A聚合BA--oB组合关系(整体与部分:不可分割,创建了整体,部分自动创建了类似于 人和头)......
  • 《CF1889C2 Doremy's Drying Plan (Hard Version)》 解题报告
    考场上不会做。如果考虑删掉哪些区间实际上不太可做。正难则反,转化贡献,考虑哪些点可以有贡献。显然一个点如果可能有贡献,那么当且仅当覆盖它的区间\(\leK\)个。于是我们记一个状态\(f_{i,j}\)表示前\(i\)个点中,\(i\)是最后一个贡献的点,已经删除了\(j\)段区间了。......
  • NOMURA Programming Competition 2020 D Urban Planning
    考虑排列\(P_i\)已经固定了的情况,那么连边\(i\toP_i\)形成有向图\(G\),最小连边数就是\(N\)减去弱连通块数。善良的出题人已经告诉你连边方案就是\((N-1)^K\),所以答案就是\(N(N-1)^K\)减去所有连边方案中弱连通块数量总和。于是只需要考虑所有连边方案中弱连通块数量总......
  • CF1764D Doremy's Pegging Game 组合数学
    CF1764DDoremy'sPeggingGame你怎么连简单题也不会?考虑满足条件当且仅当有连续的n/2向下取整段被删除。考虑最终状态一定是一次删除联通了两个连续段,然后结束。我们枚举这个连续段的长度i。最后一个删除的位置有n/2下取整*2-i种方案,设另外删除了j种,则另外删除的方案......