模拟测试20191029

$T1:数列$

所以这题和数列没什么关系

显然对于每个数答案是个单谷

直接三分,复杂度$O(nloga)$

然而这题其实不用三分,显然答案只在x的最小正整数解和最大负整数解时得到

$O(1)$可求,复杂度$O(n)$

 

$T2:数对$

考场上在(数据删除)打出"(数据删除)"后想到的解法

由于这题最终构建出来的序列$a$和$b$都不单调,我们不容易构造一个正确的排序方法保证拓扑序

那么我们可以换一个思路,不再一个一个加入新的数,而是把数插入已有序列

那么我们把数对按照$b$排序

设目前数组为$(10,2) (1,3) (2,5) (10,11)$ ($(a,b)$表示题中的$a,b$)

我们倒着扫排序后的数组,假设我们当前在处理$(10,2)$

由于$10$太大,$(10,2)$无法放在$(1,3),(2,5)$之前,只能放在$(10,11)$之前

然而直接用$(10,11)$转移$(10,2)$会导致丢失了$(1,3)(2,5)$两个数对,他们显然是可以做贡献的

但是我们发现由于我们按照$b$排序,使得当前处理数对的$b$一定是最小的

所以跳过部分的贡献即为跳过部分所有$a<=b_{i}$的点对的权值和

即$dp_{i}$=$maxlimits _{b_{j}geq a_{i}} (dp_{j}+sumlimits _{k=i+1,a_{k}<=b_{i}}^{j-1}w_{k})$

把dp变成后缀max则有

$dp_{i}$=$ dp_{j}+sumlimits _{k=i+1,a_{k}<=b_{i}}^{j-1}w_{k}$ $j$为第一个$b_{j}geq a_{i}$的点

主席树优化一下

$T3:最小距离$

以所有特殊点为起点跑最短路,同时维护最短路的起点是谁

然后枚举所有边,如果两端点是从不同特殊点到达,则更新答案

 

原文地址:https://www.cnblogs.com/mikufun-hzoi-cpp/p/11758309.html