T1
容易发现选择(r)一定是很优的,因为两个数没有任何限制,选择(r)之后只需要尽量去把剩余的二进制位上的(0)补成(1)就完了。
T2
想到了折半搜索但是不会拼起来,发现了答案是将某个前缀的概率都减去后恰好小于等于0,然后就不会搞了,实际上可以二分这个前缀的位置,然后看能不能取出合法的解满足二分的答案。
T3
没有限制的答案十分好求,考虑减去不合法的答案,不合法的一定是三元环上的点。
做法是,将图重新连有向边,入度大的向入度小的连边,入度一样则按照编号小的向编号大的连边,考虑这样做为什么是对的。
图中的点可以只分成两类,一类是度数大于(sqrt m)的点,重构图之后,这类点的入边不会超过(sqrt m)个,因为即使这个点的度数恰好为(sqrt m),也最多只有根号条入边,出边不会超过(m)条,显然,枚举的时间复杂度(msqrt m),另一类是度数不大于(sqrt m)的点,这类点的入边最多(m)条,出边不超过(sqrt m),所以总时间复杂度为(msqrt m)。
为什么这样做会更优,因为这样枚举出的三元环只要枚举一次,而暴力每个三元环都要枚举三次,所以不是很优。
T4
这种跟最大值有关系的一般要考虑单调栈或单调队列。
假设是一个序列,那么如果两个点有贡献当且仅当两个点之间没有比他们大的点,维护单调递减栈。
环要怎么办呢?应该是要断环成链不然考虑的东西很多,但是即使断了也要考虑很多,不过有一个位置是所有序列都跨不过去的,就是最大值的位置,所以将它作为起点然后断开最后单独考虑最大值是右端点的情况就完了。