zoukankan      html  css  js  c++  java
  • VK Cup 2017

    传送门

    A.Bear and Friendship Condition(完全图判定)

    •题意

      给你一个包含 n 个点,m 条边的无向图,判断是否存在三点 x,y,z,满足:

        x与y , y与z 有边,但是 x与z 无边;

      如果存在,输出 "NO",反之,输出 "YES";

    •题解

      整个图可划分成若干个联通子图,判断这若干个连通子图是否为完全图即可;

      如果存在某个联通子图为非完全图,那么,肯定会找但满足上述条件的 x,y,z,输出 "NO";

      反之,输出 "YES";

    •Code1

      求解图是否为完全图,我在模拟赛的时候,用出度判断的;

      对于包含 x 个节点的完全图,共有 $frac{x(x-1)}{2}$ 条边,每条边都表示 2度,所以共有 $xcdot (x-1)$度;

      那么,我可以用 DFS 在 O(x) 的时间复杂度内求出每个点的出度(或入度),这 x 个点的出度和应该等于 $xcdot (x-1)$;

      如果等于,则表明这个图为完全图,反之,为非完全图;

      CodeForces771A.cpp

    •Code2

      另一种求解完全图的方法,特别简洁,by mxl(偷偷看她代码 tql);

      不过,需要用 $vector$ 存图;

      假设 a,b,c,d 构成一个完全图,那么,$vector$ 中存储的信息如下:

        $egin{aligned} &vector_a:b,c,d \ &vector_b:a,c,d \ &vector_c:a,b,d \ &vector_d:a,b,c end{aligned}$;

      此时,你可发现不了什么,但是,如果 $vector_i$ 中额外加入其自身 i 呢?

        $egin{aligned} &vector_a:a,b,c,d \ &vector_b:a,b,c,d \ &vector_c:a,b,c,d \ &vector_d:a,b,c,d end{aligned}$;

      这是,你会发现,对于完全图中的所有点,其指向的其他节点的信息完全相同;

      所以,判断某图是否为完全图时,只需要判断在同一个图中的所有节点,$vector$ 中是否保存相同的信息即可;

      这样是不是每个节点都需将 $vector$ 中的信息遍历一遍,那这样岂不太耗时了 ;

      其实,只需判断处于同一个图中的 $a,b,c,d$ 点 $vector$ 中:

        (1)size() 是否相同

        (2)存在 $vector$ 中的最小的节点是否相同

      即可;

      CodeForces771A(2).cpp

    D.Bear and Company(带有技巧的DP)

    •题意

      给你一个串 S,定义在串上的一个操作:可以交换相邻两个字符的位置;

      求通过若干次操作后,使得串 S 中不包含 "VK" 子串所需的最小操作次数;

    •题解

      因为题干要求是不包含 "VK" 子串,所以,可以将 S 中的所有字符串分为三类:

        V , K , 其他;

      那么,考虑一点,最终答案中,所有 V 字符,他们之间的相对顺序是不会发生改变的;

      同样,K 和 其他字符也一样;

      假设经过 cnt 次操作后,串 S 满足条件,如果这 cnt 次操作中包含 V 与 V 的交换,那么,将这种交换取消也是满足条件的,且操作次数更少;

      同理 K 和 其他字符;

      那这样的话,关注点就在 V,K,其他 这三类字符间的相对位置的改变;

      那么,提前预处理出 V , K , 其他 这三种字符出现的位置,并存在 $vector$ 中;

    for(int i=1;i <= n;++i)///s 范围 [1,n]
        {
            if(s[i] == 'V')
                v[1].push_back(i);
            else if(s[i] == 'K')
                v[2].push_back(i);
            else
                v[3].push_back(i);
        }

      定义 $dp_{i,j,k,0}$ 表示用 前 i 个 'V' 与 前 j 个 'K' 和前 k 个 其他字符 所形成的满足条件的最小操作次数,且不以 'V' 作为结尾;

             $dp_{i,j,k,1}$ 表示用 前 i 个 'V' 与 前 j 个 'K' 和前 k 个 其他字符 所形成的满足条件的最小操作次数,且以 'V' 作为结尾;

      每次都选择往结尾加入某个字符,并更新相应的 $dp$ 值;

      最终答案就是 $min(dp[v_1 .size()][v_2 .size()][v_3 .size()][0],dp[v_1 .size()][v_2 .size()][v_3 .size()][1])$;

    •Code

      CodeForces771D.cpp

  • 相关阅读:
    https 双向证书
    MapReduce概述,原理,执行过程
    rpc,客户端与NameNode通信的过程
    小文件的解决方案
    hadoop hdfs的java操作
    HDFS的shell操作
    HDFS体系结构:(Distributed File System)
    hadoop-1.1.2集群搭建
    Hadoop入门概念
    移动端css知识总结--字体,毛玻璃效果,input和disabled
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/11561343.html
Copyright © 2011-2022 走看看