博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

20180713NOIP模拟赛

20180713NOIP模拟赛

T1:动物园 zoo.cpp 2s

  • 【题目描述】
    给定一张图,点有点权,求每个点到其他所有点中所有点的权值最小值之和。
  • 【思路】
    \(50pts\)做法:对于每个点跑一遍\(spfa\),对于每一遍\(spfa\)累加一下里面的答案,复杂度为\(O(nm)\)
    \(100pts\)做法:考虑如何更简便的计算答案,我们发现对于路径必然处于原图的最大生成树上,边权取两端点点权的最小值,从大到小枚举树边,每次添加一条边,对于答案的贡献就是\(ans += siz[fx] * siz[fy] * e[i].w\),最后令\(ans\)乘2即可,复杂度为\(O(mlogm)。\)

T2:线段计数 segment.cpp 2s

  • 【题目描述】
    给定一些覆盖线段,支持删除第k次操作,求线段覆盖情况。
  • 【思路】
    \(30pts:\)模拟
    \(100pts:\)树状数组,首先离散化,用两个树状数组,一个维护区间左端,一个维护区间右端,查询时用树状数组2中小于等于当前右端点的个数减去在树状
    数组 1 中查询严格小于当前左端点的个数,复杂度\(O(nlogn)\)

T3:填数游戏

  • 【题目描述】
    给定空矩阵和一些已经填了的数,只能天1或-1,求有多少种方案可以使得对于每个数的每一行或每一列乘积为-1\(?\)
  • 【思路】
    30pts做法:dfs枚举。
    10pts做法:当n+m为奇数时为0.
    由于注意到$ k < max(n,m)$,则必然有一行或一列是完全空的假设空的是一行,除了这行其他行随便填,满足其他行的乘积都是-1,然后用这一行来收尾。显然其他行都满足后,这一行只有 1种填法。
    70pts做法:由上面可得,用乘法原理直接计数。
    100pts做法:设p为当前没有填的格子数,答案为\(2^p-1\).
posted @ 2018-07-13 21:16  Allorkiya  阅读(234)  评论(0编辑  收藏  举报