首页 > 其他分享 >[CSP-S 2019 江西] 网格图

[CSP-S 2019 江西] 网格图

时间:2024-10-08 21:13:29浏览次数:1  
标签:node val int sum 网格 1ll 2019 CSP 连过

算法

暴力

建图直接跑 Kruskal, 显然能通过 \(64pts\) 的点

正解

分析 Kruskal 的复杂度
发现比较边权非常的浪费, 很显然是不必要的
并查集求环路也浪费了网格图的性质

考虑优化
把每一条边看做一个整体, 整体比较只需要 \(O((n + m) \log (n + m))\)
问题是这样比较之后正确性如何

MST 中一定包含边权最小的边

所以正确性没问题, 但是还需要高效判环

pAG2VQU.png

对于其中

这条环上不属于 \(F\) 的另一条边 \(f\) (一定只有 \(1\) 条)

的证明:
假设不存在 \(f\), 那么 \(T + e \subset F\), 即 \(F\) 中存在一个环, 假设不成立

所以我们知道, 只要你的边权小, 不会构成环, 你就在最小生成树中

所以一直选择横行和纵行中边权最小的边加入最小生成树, 判环的方法是

前提条件 :
[(连完这次之后)目前已经连过的列数] \(\geq 2\) \(\And\) [(连完这次之后)目前已经连过的行数] \(\geq 2\) (即成环的条件)

  • 当我们在连的是行的权值时:如果我们看到连完之后出现了环,那么就可以省去 ([目前已经连过的列数] - \(1\)) 条边

  • 当我们在连的是列的权值时:如果我们看到连完之后出现了环,那么就可以省去 ([目前已经连过的行数] - \(1\))条边

代码

#include <bits/stdc++.h>
const int MAXN = 6e5 + 5;
struct node
{
    int type, val;
} a[MAXN];

bool cmp(node a, node b) { return a.val < b.val; }

int main()
{
    int n, m, x = 0, y = 0;
    long long sum = 0;
    scanf("%d %d", &n, &m);

    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i].val), a[i].type = 1;
    for (int i = n + 1; i <= n + m; i++)
        scanf("%d", &a[i].val), a[i].type = 2;

    std::sort(a + 1, a + n + m + 1, cmp);

    for (int i = 1; i <= n + m; i++)
    {
        if (a[i].type == 1)
        {
            sum += 1ll * (m - 1) * a[i].val;
            x = x < n ? x + 1 : x;
            if (x > 1 && y > 1)
                sum -= 1ll * (y - 1) * a[i].val;
        }
        else
        {
            sum += 1ll * (n - 1) * a[i].val;
            y = y < m ? y + 1 : y;
            if (x > 1 && y > 1)
                sum -= 1ll * (x - 1) * a[i].val;
        }
    }

    printf("%lld", Sum);
    return 0;
}

然而 ctj, 但是也不难写...

总结

善于从暴力中总结出正解

标签:node,val,int,sum,网格,1ll,2019,CSP,连过
From: https://www.cnblogs.com/YzaCsp/p/18452410

相关文章

  • 2019_07_16_01
    this、apply、call、bindthisthis永远指向最后调用它的那个对象apply、call的区别对于apply、call二者而言,作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下:varfunc=function(arg1,arg2){};就可以通过如下方式来调用:使用场景参数明确使用call......
  • 10.8 模拟赛(2023 CSP-S 十连测 #5)
    炼石计划10月28日CSP-S十连测#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1秒了。30min。T2题目越短越难。但是链的是经典题目,写了。小样例太水,大样例太大,不方便猜结论。于是先写暴力然后自己造样例。模拟了五六组感觉可以按照lca的深度降序排序,然后能选就选。这......
  • CSP 模拟 38
    Ascoreandrank神秘贪心,如果全是正数,每当大于等于\(S\)时删除最大的最优。如果\(S\)是负数,删去所有大于等于的数就是答案。思考删除最大的为什么不对,会有这样的情况,一个负数很小,使得选择区间改变,导致维护的集合清空。这时可以选择拿正数来抵消负数。具体来说,当前\(sum\)......
  • csp-s 模拟 8
    csp-s模拟8T1scoreandrank特殊性质,题意转换妙妙题对于\(S\)小于等于\(0\)的情况答案显然是所有大于等于\(S\)的个数。现在讨论\(S\)大于\(0\)的情况。先对序列做一个前缀和,题目要求即是让所有值减去前缀最小值小于\(S\)考虑有一段连续正整数的和大于\(S\),则......
  • XYD1005CSPS
    T1传送门[最短路,二分答案]Description无向连通图,求出一个最小的\(x\),使得每两点之间存在一条路径可以划分成不超过\(k\)段路径,且每段路径长度不超过\(x\),只能从节点处切割,不能从边中间划分。\(n\le100\),无重边自环。Solution\(n\)非常小,又要考虑每两个点,自然想到全......
  • csp-s模拟10
    csp-s模拟10\(T1\)T3673.欧几里得的噩梦\(0pts\)部分分\(0\%\):状压加枚举子集。\(20\%\):线性基暴力做。正解\(T2\)T3672.清扫\(6pts\)原题:[AGC010C]Cleaning钦定根节点\(rt\)的度数\(\ge2\),所以需要特判\(n=2\)的情况。部分分未知\(pt......
  • csp-s模拟10
    rank31,垫底了,T10pts,T218pts,T30pts,T450pts状态有点不好,策略有问题,T4是可以切的,但是不知道为什么弃了。T1不会线性基寄。T3奇怪结论题,T2结论题。在猜结论上还是不行。T1欧几里得的噩梦用到了线性基线性无关的性质,将两个数连边,把环去掉,并查集判断即可。统计答案用快速......
  • Linux csplit命令
    csplit命令在Linux中用于将文件分割成多个部分,基于指定的模式或固定数量的行。与split命令不同,csplit允许更复杂的分割条件,例如基于正则表达式匹配或特定字符的出现次数。基本语法csplit[选项]文件名模式文件名:要分割的文件。模式:分割文件的依据,可以是正则表达式或数字。......
  • Day1 备战CCF-CSP练习
    Day1201403-1问题描述有$N$个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数($a$和$-a$为一对相反数)。输入格式第一行包含一个正整数$N$。$(1≤N≤500)$。第二行为$N$个用单个空格隔开的非零整数,每个数的绝对值不超过$1000$,保证这些整数各......
  • 『模拟赛』CSP-S模拟10
    Rank没学线性基输麻了,A.欧几里得的噩梦线性基,输麻了。B.清扫思维题,差点签了。(感觉其实不是很难啊,没有紫的水平)一个叶子结点和另一个叶子结点的最短路径一定经过它的父节点。根据这一性质可以让整棵树的合法性拆分成每个节点的合法性。考虑如何判断每个节点的合法性。......