ACM-ICPC 2018 南京赛区网络预赛

こ雲淡風輕ζ 提交于 2021-01-13 18:45:12

ACM-ICPC 2018 南京赛区网络预赛


B. The writing on the wall

  • 题意:
  • 给定一个n*m的矩形,1≤n≤10^5,1≤m≤100,矩形里有k个点被损坏,0≤k≤10^5,现在你需要计算出所有合法的矩形个数,合法是指矩形内不包括损坏的点。
  • sol:
  • 首先对于每一个点,都计算出一个sum值,代表从这个位置往下走(在列上走),往下走几格能走到坏点。这一部分可以预处理做完。
  • 然后,我们仅考虑只有两列的情况。此时,我们对sum[1][1],和sum[1][2]进行研究。刨去1×1的小矩形,考虑2×l的矩形。我们可以发现,包含第一行两个格子的所有矩形数为min(sum[1][1],sum[1][2])。然后考虑第二行,包含第二行两个格子的所有矩形数为min(sum[2][1],sum[2][2]),并且这里不包含第一行。所以这样就可以往下推了。
  • 那么考虑多列的情况,我们对第一行进行考虑,可以发现,如果当前位置左边那个sum比它小,那么左边的所有矩形数都被左边的数给控制了,简而言之,在左边已经被算过一次了,所以可以直接拿来用。计算出左边第一个比自己小的,单调栈即可。总复杂度O(n*m)。

E. AC Challenge

  • 吐槽:这个题貌似lintcode都有啊。。
  • 题意:
  • 给定每门课的a,b值,一天只能修一门课,每门课可能有先修课程。在第t天修课程得到的价值是a×t+b。求这个价值最大值。(0<n≤20)
  • sol:
  • 看到这个n,就可以发现是一个状压了。预处理用一个数字表示第i门课的先修课程。dp[i]表示,已经修的状态数为i时的最大价值。__builtin_popcount() 一下t,随变转移一下即可。

G. Lpl and Energy-saving Lamps

  • 吐槽:我们是冠军!!
  • 题意:
  • 当然跟lpl没什么关系。给定n个房间,每个房间都需要填充一定的球。开始你的球的数量为0,每次你都买m个球,然后从头开始,去找到是否有未被填充过的房间的球数可以一次性被填充满,若可以,填充。询问,每次买球,你填充完的房间数,和手头剩下的球数。
  • sol:
  • 二分+线段树。最多买100000次球。每一次买球之后,二分一下哪一个放间是最先被填满的。线段树记录区间最小值。找到房间之后,修改房间的属性为inf。复杂度n×log*log。

L. Magical Girl Haze

  • 吐槽:假题。
  • 题意:
  • 有n个点,m条有向边,每条边有边权,现在要求从1走到n的最短路。你可以进行至多k次操作,每次都能将一条边的边权修改为0。
  • sol:
  • dp[i][j]代表到了第i个位置,使用了j次操作的最小值,然后往连着的边递推。加一下优先队列,保证每个状态至多往后递推一次。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!