传送门

A - Easy \(h\)-index

签到。

B - Higher \(h\)-index

题意:
定义\(h\)指数为现在至少有\(h\)篇论文,它的被引用次数至少为\(h\)
现在你要开始写论文,若在一篇论文上花\(x\)小时,则会被引用\(a\cdot x\)次;同时,写一篇论文的时候,也可以引用之前自己写过的论文。
现在共有\(n\)小时来分配写论文,问最大的\(h\)指数为多少。

思路:
被这个题卡了两个小时...二分思路其实很早就有了,但是细节没有考虑清楚。

  • 显然\(h\)指数具有单调性,故二分\(h\),那么我们接下来就是判断\(n\)个小时能否通过合理的分配,最终满足\(h\)指数。
  • 首先肯定要写\(h\)篇论文,并且每篇尽可能应用前面的文章,那么最后得到的引用序列就为:\(a+h-1,a+h-2,\cdots,a\)
  • 注意到这个值是连续下降的,观察发现我们每次多花一个小时写一篇新论文,则\(1\)\(h\)号论文中至多有一篇的引用次数会增加到\(h\),等价于在这篇论文上多花一个小时来达到目标。
  • 所以策略就是判断\(a\)\(h\)的大小关系,若\(h<a\),那么就在后面新写\(a-h\)篇论文即可。

代码很短:

C - Just \(h\)-index

似乎是个主席树裸题...

F - Sorting

直接按规则排序即可,因为涉及到分数,通分又会爆long long,所以手写一个分数类。但这还不够,最后比较分数的大小的时候辗转相除一下即可。复杂度多个\(logn\).

G - String Transformation

题意:
给出只由\(a,b,c\)构成的\(S\)串和\(T\)串,现在有三种特殊的串\(aa,bb,abab\),可以在\(S\)串中任意插入或者删除,问最后能否变为\(T\)串。

思路:

  • 因为特殊字符串不涉及\(c\),所以相当于\(c\)为分隔符,现在只用考虑全由\(a,b\)构成的两个字符串是否相等。
  • 注意一个特殊的东西:\(ab\)可以变为\(ba\)\(ba\)也可以变为\(ab\)
  • 那么可以大力猜测最终倘若把字符串化为最简,是由很少的几个字符构成。
  • 因为无论删除\(aa,bb\)还是\(abab\)\(a,b\)个数的奇偶性不会发生改变,那么我们直接根据两个串的\(a,b\)奇偶性来判断就行。
  • 正确性:假设我们全都删掉连续的相同的,并且把一些连续的\(abab\)删掉,显然最后只有可能是\(aba,\emptyset,a,b,ab\)这几种情况,然后就可以发现与奇偶性相关了。

代码如下:

J - Vertex Cover

题意:
给出一个完全图,第\(i\)个点的权值为\(2^i\)
询问有多少种选边方式,使得覆盖这些边的点集之和为\(k\)(给出其二进制表示)。
定义覆盖一条边即为这条边的两个端点至少有一个点被选中。
同时,选择点去覆盖边时,尽量选择权值之和较小的点。也就是说,对于一条边的两个点,只选择权值较小的那一个点即可,不选择另一端点(假设图中只有这一条边)。

思路:

  • 按二进制位从高到底考虑:
  • 假设当前为\(1\),设前面有\(a\)\(1\)\(b\)\(0\),那么方案数为\((2^b-1)\cdot 2^a\),表示至少连向一个\(0\),同时可以任意连向\(1\),这样可以保证这个\(1\)必选;
  • 如果当前为\(0\),方案数为\(2^a\),表示可以随便连向前面的\(1\),因为前面的\(1\)必选,所以这个\(0\)必然不会选。
  • 然后就没了。

代码如下:

K - 2018

题意:
给出\(a,b,c,d\),问有多少对\((x,y)\),满足\(a\leq x\leq b,c\leq y\leq d\),且\(x\cdot y|2018\)

思路:
分情况讨论即可:

  • \(x\)\(1009\)的奇数倍;
  • \(x\)\(1009\)的偶数倍;
  • \(x\)为偶数且不为\(1009\)的倍数;
  • \(x\)为奇数且不为\(1009\)的倍数。

这样就能覆盖所有情况了。

01-06 17:06