#Educational Codeforces Round 87
MiFaFaOvO_tsdy
A. Alarm Clock
阅读理解题
题意:
有一个闹钟,第 \(b\) 分钟第一次响 ,每次响完要花 \(d\) 分钟关掉,两次之间隔 \(c\) 分钟(指开始时间),求睡够 \(a\) 分钟且闹钟在响的最小时刻,没有输出 -1,多测。
\(T \leq 1000\),\(0 \leq a,b,c,d \leq 10^9\)。
题解:
第一次响之前够 \(a\) 分钟显然答案是 \(b\) ,否则的话每次闹钟之间能睡 \(max(c-d,0)\) 分钟,算一下闹钟要响多少次就行了。
\(O(T)\)
4min
B. Ternary String
题意:
有一个只有 \(1,2,3\) 的字符串,求最短子串同时包含 \(1,2,3\),多测。
\(T \leq 10^4\),总串长 \(\leq 3\times 10^5\)。
题解:
假设从 \(l\) 开始最短满足条件的子串是 \([l,r]\) ,\(r\) 显然单调不降,双指针一下就好了。
\(O(\sum length)\)
8min
C1. Simple Polygon Embedding
C题放几何题,差评
题意:
给一个正 \(2n\) 边形,边长为 \(1\),求可以覆盖它的正方形的最小边长,多测。
\(T,n \leq 200\),保证 \(n\)是正偶数。
题解:
可以发现(?),最优情况一定是正方形与多边形有 \(4\) 个边重合,答案就是正多边形的边心距 \(\times 2\),直接拿三角函数算就行了。
\(O(\text{三角函数} \times T)\) (不知道三角函数具体是咋实现的)
16min
C2. Not So Simple Polygon Embedding
C题放这么变态的几何题,必须差评
题意:
给一个正 \(2n\) 边形,边长为 \(1\),求可以覆盖它的正方形的最小边长,多测。
\(T,n \leq 200 , n>1\),保证 \(n\)是奇数。
题解:
经过画图和猜结论可以发现(答案应该和半径跟边心距有一些关系,然后答案肯定比较对称,有对称性的线可以想到角平分线(??)),最优情况一定是多边形的边心距和半径的角平分线长度 \(\times 2\),直接拿三角函数算就行了(
\(O(\text{三角函数} \times T)\) (还是不知道三角函数具体是咋实现的)
23min
D. Multiset
题意:
维护一个可重集,\(q\)次插入 \(\leq n\) 的正整数和删除第 \(k\) 大,所有操作结束后随便输出里面的一个元素,没有输出 0。
空间限制 \(28 MB\),\(n,q \leq 1e6\)。
题解:
第一眼 \(\text{multiset}\) ,但是空间过不了(
由于值域比较小,用树状数组维护每个数的出现次数,然后二分查询第 \(k\) 大,\(O(q\log^2n)\) 理论上过不了。但是实际上能过
考虑把二分换成倍增,由于树状数组里面本来就有 \((now-\text{lowbit} (now),now]\) 的和,所以倍增的时候查询是 \(O(1)\) 的。
查询时候随便挑一个输出就行。
时间:\(O(q\log n)\) 空间:\(O(n)\)
11min+1WA(没判边界,\(now+\text{lowbit} (now)>10^6\))
E. Graph Coloring
题意:
给一个 \(n\) 个点, \(m\) 条边的无向图,要给每个点一个标号 \(\in \{1,2,3\}\),要求每条边两端绝对值差 \(=1\) 且 \(i\) 的个数 \(=n_i\),构造方案,没有输出-1。
\(n \leq 5000 , m \leq 10^5 , n_1+n_2+n_3=n\)。
题解:
每条边两端显然奇偶性不同,把无向图进行黑白染色,若不存在黑白染色答案一定是-1。
由于连通块之间没有限制,所以可以把整个连通块反色,设图里面第 \(i\) 个连通块里面有 \(a_i\) 个白点,\(b_i\)个黑点,问题就变成了有 \(n\) 个二元组,要从每个里面选一个数,使得和 \(=n_2\)。
这个显然可以用 \(dp\) 解决,\(dp_{i,j}\) 表示前 \(i\) 个集合选出的数可不可以和为 \(j\),\(lst_{i,j}\) 表示转移到 \(dp_{i,j}\) 上一个选的是 \(a_i\)还是 \(b_i\) ,这两个dp数组可以用 \(\text{bitset}\) 存。 (虽然好像不用)
时间:\(O(n^2+m)\) 空间:\(O(\frac{n^2}{64}+m)\)
25min,WA1(变量写错??)
F. Summoning Minions
题意:
有 \(n\) 个pair \(\{a_i,b_i\}\),\(k\) 个空格子,每次操作可以把一个pair放到格子里,并把别的所有格子里面的 \(a_i\) 加上 这个pair的 \(b\),或者可以从格子里面删掉pair,每个格子最多装一个,要求操作完 \(\sum a_i\) 最大,构造方案,多测。
\(T,n,k \leq 75, k \leq n\),\(0 \leq b_i \leq 10^5\),\(1 \leq a_i \leq 10^5\)。
题解:
考虑最终状态一定是有些在格子里有些不在(废话),假设知道格子里面的是哪些,一共有 \(tot\) 个,那么最优的操作序列一定可以是先把 \(tot-1\) 个最后在格子里的放进去,然后把不在格子里的放了然后立刻删掉,最后再把剩下的那个放进去。
稍微证一下:最后第 \(i\) 个人不在格子里的最大贡献是 \((tot-1)\times b_i\) (因为自己要占一个格子),剩下的由相对顺序决定。
显然一定要把 \(k\) 个格子都放满。
最后在格子里的那些一定是按照 \(b_i\) 升序放的(不然的话调整过来会更优)。
然后就可以dp了,先按照 \(b_i\) 排序,然后 \(dp_{i,j}\) 表示前 \(i\) 个里面,选了 \(j\) 个最后要留下的最大值。转移的时候枚举选不选,选的话转移代价是 \(a_i+j\times b_i\),否则是 \(k\times b_i\),\(lst\) 数组和E题差不多。
时间:\(O(Tnk)\) 空间:\(O(nk)\) (但是为什么\(T,n,k \leq 75\))
28min
G. Find a Gift
题意:
交互题。有 \(n\) 个东西,重量为 \(a_1,a_2\cdots a_n\) ,令它们的最大值 \(=mx\),不等于 \(mx\) 的 \(a_i\) 有 \(k\) 个,每次可以询问两个集合的重量和的大小关系(\(>,<\)或\(=\)),求编号最小的重量 \(\neq mx\) 的编号,多测。
\(2k \leq n \leq \sum n \leq 1000\) ,最多询问 \(50\) 次,\(T \leq 500\)。
题解:
考虑先找出一个最大值,可以随机或者分治。
分治就是每次把集合分成两部分,然后要重的那部分,但是它是错的,反例:1000 1000 1000 1 999 999 1000 100。
随机就是先随便选出 \(31\) 个元素(不一定是 \(31\) 个,差不多就行了),由于最大值个数 \(\geq \frac{n}{2}\),所以随机不到最大值的概率\(\leq \frac{1}{2^{31}}\)。然后拿 \(30\) 次比较就可以确定这 \(31\) 个数的最大值了。
把那个最大值和剩下的去比,如果时小于就得到了答案,等于的话就得到了另一个最大值。大于的话就可以去买彩票了
然后再拿这两个最大值和剩下的比,如果是小于就知道答案一定在某两个数里面,等于的话就得到了另外两个最大值。
然后再拿这 \(4\) 个最大值和剩下的比……以此类推
但是这样询问次数为什么是对的呢?
考虑有两个集合:最大值,可能不是最大值的。
一开始最大值里面有一个元素,可能不是最大值的有 \(n-1\) 个。
在最大值个数 \(\leq\) “可能不是最大值”的个数的时候,如果某次询问是小于,那么 “可能不是最大值” 的那个集合大小最少会 \(\div 2\) ,否则的话 “最大值” 那个集合的大小会 \(\times 2\)。
否则的话,可以直接问“可能不是最大值” 里面的一半元素和等数量的最大值,那么 “可能不是最大值” 的那个集合大小也至少会 \(\div 2\)(上取整)。
由于 “最大值” 的大小最多翻倍 \(10\) 次,“可能不是最大值” 的大小最多减半 \(10\) 次,所以不会超过 \(20\) 次,加上前面的 \(30\) 次就是 \(50\) 次。
时间复杂度:\(O(\sum n\log n)\) (实现的时候用了 \(\text{set}\))
浙公网安备 33010602011771号