摘要:
由于算法基于随机,不适宜作为题目正解,但在参数调得好的时候可以得到较高分数甚至AC,用于实在迫于无奈时的算法或暴力算法范围外的骗分算法 典型的邪教算法(我就喜欢邪教的) 基本思想是随机转移,从而确定最优解,大多数用于计算几何(但其实你如果够牛也可以在其他情况下用来骗分) 基本的实现步骤是: 1.取一 阅读全文
摘要:
做了相当一部分的退火题练手,现在才算刚刚入了门。 于是做一个经验总结。 随机函数 有没有觉得 \(rand()\) 莫名的不好用?我们在此为您推荐 \(mt19937!\) 在支持 \(c++14\) 的环境下,可以生成更大的随机数,而且更快,岂不美哉? 实用展示 mt19937 rd_ori(ti 阅读全文
摘要:
随便提几笔吧,时间不太充裕就不写太多了。 就是在区间的基础上再加上一个时间。 来个例题 数颜色|维护队列 直接就是考虑按照 \(l\) 所在块, \(r\) 所在块, \(t\) 的优先级排序,然后可以证明在块长取 \(n^{\frac{2}{3}}\) 时最优,可用最劣情况证明其复杂度。 然后就是 阅读全文
摘要:
引入 如果你已知一个序列,你已知其 \([2,6]\) 的区间和以及原序列,现在要你求$[2,7]$的区间和,你会怎么办? 显然我们可以在 \([2,6]\) 的基础上加上原序列的第 7 位,就得到了 \([2,7]\) 的区间和。 同理,如果我们需要求出 \([2,5]\) 的区间和,我们只需要在 阅读全文
摘要:
思想就是分治! 然后就是每次二分区间,然后在分治统计左右区间之后,考虑统计跨越左右区间的数对。 给个模板题 陌上花开。 我们对于这个三维偏序问题,可以考虑CDQ分治。 先对于原序列按照a,b,c排序,这样保证a的单调增。 然后分治,对于每个小区间按照b,a,c排序,这样在右边区间的a大于左边区间的前 阅读全文
摘要:
概念 中缀表达式 就是我们平时用的式子。 前缀表达式 也叫波兰式,除了处理顺序与后缀表达式相反(从右往左),其他完全一致。 后缀表达式 也叫逆波兰式,从左往右处理,如果扫到数字,就把数字入栈;如果是字符,那么从栈顶取出两个数字进行运算,在将计算结果入栈。最后栈中的元素为结果。 表达式转换 前、后缀转 阅读全文
摘要:
发现以前都没有真的理解二分边界应该取多少。所以手写lower_bound出了一些锅,于是用了3种不同方式拍了几组数据改了下错,才真正理解了。 先上对拍程序(windows) \(mian.cpp\) #include<bits/stdc++.h> #include<windows.h> using 阅读全文
摘要:
对拍模板,很好理解,就不多讲了。 #include<bits/stdc++.h> using namespace std; int main(){ while(1){ system("data.exe > data.in"); int t=clock(); system("hard.exe < da 阅读全文
摘要:
我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用。 ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把求 LCA 转换为 RMQ问题。我们对于树求一遍欧拉序,就是那个回溯也会记录的那个。我们处理出每个数 阅读全文
摘要:
预处理复杂度$O(n\ log\ n)$,查询复杂度$O(log\ n)$。 主要思想是倍增,通过预处理出夫亲的倍增数组实现快速求LCA 1 的父节点取 0 是为了方便树上差分,1 的深度设置得比 0 大是为了防止在求LCA时跳到0. 挺好理解的。 #include<bits/stdc++.h> u 阅读全文