T1:均值不等式或极大极小值定理直接出解。注意:
精度问题
有人可能会写:
ans_min = (long long)sqrt((double)g * l);
这样会被卡精度,因为double大概只有15位10进制有效数字。只能得到60分。
解决方法是:
ans_min = (long long)sqrt(l / g) * g;
当然有人可能直接long double保平安了……
T2:Trie树上放些指针就好了。
T3:实际上就是一个可持久化并查集,然后整个状态空间形成了一棵树,用树上倍增即可。
考虑更简便的做法。
首先如果只有Add操作,MST的形态是不会变的。
如果没有Return操作。Delete直接用可撤销并查集即可(不要路径压缩,因为代价是均摊而不是严格)。
有了Return之后的难点就在于前两种操作可以保证的均摊复杂度分析失效,我们就这一点处理:
考虑一个Return操作,如果前面是Add,那这就是一个Delete 1。
考虑一个Delete,可不可以做到,如果后面的操作不是Return,我们就“真删”,否则“假删”呢?
思考如何“假删”,就是回答前k'条边形成的生成树的权值和,这个用维护一个数组即可。
T1:最小化sum{ a[i]%x+a[i]/x },变形成 sum{ a[i]-a[i]/x *(x-1) }。我们枚举x,问题就变成了对每个x求sum{ a[i]/x }。