做题经验(个人瞎扯淡)
分类
一、小数据范围,需要枚举,求最大或最小值
搜索,for循环枚举
二、数据较大,也有枚举特征,或等差序列
动态规划
三、题目比较长,题中有对流程的描述
模拟
四、看起来像数学中的找规律题
数论,想不出公式就递推
五、给了一个图,找最短路径
最短路算法
六、给了一个图,判断图的连通性并在连通时求最大或最小花费
生成树
七、在一段区间里修改或求和
线段树、树状数组、模拟
八、最大值最小或是最小值最大或判断一个数成不成立
二分答案
九、素数的判断
枚举到根号a。
十、中位数与最小值
均分纸牌问题。
十一、网络流的限流
新建一个汇点,连一条流量为限制流量的边。
十二、把一个数的每一位拼成一个整数
for(int i=t1;i>=1;i--) { tot=tot*10+ori[i]; }
十三、带权二分图最大匹配
源点到左边点流量为1,费用为0;左边点到能匹配的右边点流量为1,费用为边权;左边点到汇点流量为1,费用为0。
十四、平面图染色
颜色=2时,如果n是基数则方案数为0,n是偶数则方案数为2。
十五、询问一些序列中最多重复的个数
做一个统计序列,在序列的左端点+1,右端点-1,然后做这个序列的前缀和。
十六、bitset神器
这玩意所占空间是相同元素个数的bool数组的1/8,运行时间是1/32(32位系统)或1/64(64位系统)。
十七、cctype库函数
十八、堆的复杂度计算
log(堆的大小),与输入数据的规模无关。
十九、nth_element(first,kth,last)函数
使第k大元素处于第k位置,并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。
二十、long double类型函数
在一般的cmath函数后面加一个l,否则即使传参是long double,计算的结果也是double。输入/出long double最靠谱的方式是用double类型输入/出然后转成 long double。
二十一、位运算^
如果a^b==2,那么a^2==b。
二十二、数对个数
可重:n(n-1)。不可重:n(n-1)/2。
二十三、优先队列的comp
大小于号方向与元素大小相反
#include <queue> #include <iostream> using namespace std; struct cmp { bool operator()(int i, int j) {return i < j;} }; int main() { priority_queue<int, vector<int>, cmp> q; for (int i = 0; i < 5; i++) {q.push(i);} for (int i = 0; i < 5; i++) {cout << q.top() << ' '; q.pop();} return 0; }
暂时这些,想到在更。