zoukankan      html  css  js  c++  java
  • ZOJ Monthly, June 2014 解题报告

    A.Another Recurrence Sequence

    B.Gears

    题目大意:有n个齿轮,一開始各自为一组。之后进行m次操作,包含下面4种类型:
    1.合并两组齿轮。合并的两个应该反向旋转
    2.把某个齿轮从所在组删除,自为一组。但不影响同组其他齿轮的状态与关系
    3.询问两个齿轮是同向、反向或无关系(即不在同一组)
    4.询问某个齿轮所在组的齿轮总数

    分析:典型的并查集操作,可是注意两点:
    1.因为操作3要询问两个齿轮的相对状态。因此对并查集中每一个元素应当保存它的状态信息。状态是相对的。仅仅须要保存每一个元素相对于父元素的状态。在查询所属集合时顺便更新状态信息。

    如用depth[i]表示齿轮i相对于父齿轮的深度,那么两个齿轮属于同一组且深度奇偶性同样时同向旋转。更新depth数组也行简单,i对j的深度 = i对k的深度 + k对j的深度。

    2.操作2涉及删除某个元素。

    另外开一个数组id,用id[i]表示元素i实际所在的位置。当删除元素i时。令id[i] = new id,同一时候fa[id[i]] = id[i],即id[i]自为一组。这样一来。之后涉及到元素i的操作都用id[i]取代,而原来的i元素依旧存在,仅仅只是它仅仅起到占位的作用,以维持原集合的相对关系。相当于id[i]表示元素i的指针。



    C.Consecutive Blocks

    题目大意:给定一个整数序列,要求删除最多k个数后,新序列中连续相等的子序列长度最大,输出该最大长度。


    分析:除了F题搞笑外这个就是最简单的题了。记录每一个数出现的位置(因为数字可能非常大。先把数字映射到1..k),然后计算以每一个位置结束时的最大长度就可以。

    D.An Easy Game

    题目大意:给定两个0-1序列s1, s2,操作t次,每次改变m个位置,求把s1改变为s2的方法总数。


    分析:明显的DP。注意s1和s2哪些位置同样并不重要,重要的是有几个位置不同。改变的时候也一样,改变哪些位置并不重要。重要的是改变之后有几个位置不同。所以用dp[i][j]表示i次操作之后有j个位置不同的方法数,答案就是dp[t][0]。对于dp[i - 1][j],经过一次操作之后如果把k个位置从不同变为同样。剩下m - k个位置从同样变为不同。那么
    dp[i][j + m - k - k] += dp[i - 1][j] * C(j, k) * C(n - j, m - k)
    当中C(j, k)表示组合数,即从j个不同的位置选出k个改变。循环k就可以。



    题目大意:给定一个无向图,要求删除一些边使点p和点q不连通。首先是使花费最少。若有多组解则使删除的边最少。


    分析:典型的最小割。最大流就可以。仅仅须要把每边的花费c改为c = c * (|E| + 1) + 1就可以使删除的边最少。当中|E|为边数。为方便把|E|换为一个较大的数也能够。



    分析:搞笑题。就不解释了。




    题目大意:给定一个有向图。要求把点分为k个集合,使得每一个集合中的随意两点a, b满足a, b互相不可到达。

    分析:求出强连通分量后缩点,得到有向无环图,dfs该图求出各点深度(深度加权,权值为强连通分量大小),深度最大值即答案,由于这一条路径上随意两点都可从深度小的一点到达深度大的一点,所以必然属于不同集合;又能够把其他路径(长度为len)上的各点依次归到集合1..len。




  • 相关阅读:
    第十二章 基本数据类型
    第十一章 变量名的力量
    第十章 使用变量的一般事项
    第九章 伪代码编程过程
    第八章 防御式编程
    JMeter简介
    第七章 高质量的子程序
    第六章 可以工作的类
    第五章 软件构建中的设计
    第四章 关键的“构建”决策
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7305370.html
Copyright © 2011-2022 走看看