Binary-Search
二分 Stop learning useless algorithms, go and solve some problems, learn how to use binary search. —— Um_nik 所以,let’s learn how to use binary search。。。 让我们先看一道题: 如果让你在1~100中猜一个数,每次你猜完我会告诉你大了或小了,你会先猜多少?50 大了小了对了这时你相当于得到了一个新的范围1~49这时你相当于得到了一个新的范围51~100输出答案 其实,你刚刚已经完成了一部分二分,然后就是代码实现部分 Code: 1234567891011121314151617//查找x的位置int find(int x){ int l = 1 ,r = n + 1; while(l < r) { int mid = (l + r)/ 2; //防止溢出 if(a[mid] >= x) r = mid; //小于中间的数,在左区间 ...
Greedy
贪心 贪心这东西会贯彻你的OI生涯。。。你会在CSP-J中见到ta,你还回在NOI里见到ta(当然你要先过省选 贪心其实就是找到一个最优决策,并每一步都按照决策操作(听起来是不是很simple。。。 如何证明我的贪心是正确的??? 你写一下不就知道了?? 尝试证明做出任何更改都会使结果更劣 尝试直接数学证明 尝试感性理解 Example: P1094 [NOIP2007 普及组] 纪念品分组 思路: 对$a$进行排序,定义$l=1,r=n$ 每次尝试把al,ara_l,a_ral​,ar​放进当前组,不行则ara_rar​单独一组 Code: 建议读者自己先Code 123456789101112131415161718192021222324252627282930#include<iostream>#include<algorithm>using namespace std;int main(){ int w,n; cin>>w; cin>>n; ...
PrimeGCD
Prime and GCD 素数 素数是什么?见小学数学书 如何判断一个数是否是素数? 对于任何正整数,因子总是成对出现。所以只要要判断的数nnn在222~n\sqrt{n}n​之间没有因子,nnn就是质数 123456789bool isPrime(int a){ if (a < 2) return 0; for (int i = 2; i * i <= a; ++i) if (a % i == 0) return 0; return 1;} GCD GCD(Greatest Common Divisor) 最大公约数 其实C++有内置的GCD函数,但是因为某种原因,建议不要使用! 再一次翻一翻你的小学数学课本,老师肯定教过你辗转相除求最大公约数 好习惯,使用前先证明: 证明 设gcd⁡(x,y)=d\gcd(x,y)=dgcd(x,y)=d,则此时x=k1⋅d,y=k2⋅dx=k_1\cdot d,y=k_2\cdo ...
QuickPow
快速幂 求ana^nan可以把它拆成a×a×a×...×a⏟n个a\underbrace{a \times a\times a \times ...\times a }_{n个a}n个aa×a×a×...×a​​ 此算法的时间复杂度为O(n)O(n)O(n) 但它不够快!!! 考虑优化上面的算法 ∵a2n=(an)2\because a^{2n}=(a^n)^2∵a2n=(an)2 ∴\therefore∴可以把时间复杂度降到O(logn)O(logn)O(logn) 1234567891011121314151617181920//递归方法long long binpow(long long a, long long b) { if (b == 0) return 1; long long res = binpow(a, b / 2); if (b % 2) return res * res * a; else return res * res;}//非递归方法long long binpow(long long a, long long ...
STL
STL和其他的一些东西 尽管巨佬都说:“STL常数大,你手写它不香吗?” 但是,STL确实很香。。。 queue 首先,查一下词典 所以,其实就是一个先进先出的容器 123456queue<变量名> q; //存的变量可以是int,char等,也可以是struct等q.front(); //返回队首元素的值q.pop(); //弹出队首元素q.size() //返回队列的大小q.push(x) //把x压到队尾q.empty() //返回1为空,0为有元素 用处见BFS stack 还是查一下字典 可以发现,stack是一个后进先出的容器 123456stack<变量名> st; //存的变量可以是int,char等,也可以是struct等st.top(); //返回栈顶元素的值st.pop(); //弹出栈顶元素st.size() //返回栈的大小st.push(x) //把x压到栈顶st.empty() //返回1为空,0为有元素 vector vector,可以当数组用,但又比数组高级!!!当然会更慢qwq 12345678910111213 ...
Sort
排序 当你看到一个杂乱的序列,你可能想让它有序。这时,你就需要排序算法为什么听着像广告词? 这有一些你不会用到的排序算法的伪代码,因为CCF可能会考。。。 、 sort 这东西在C++旧版的平均复杂度是O(nlogn)O(nlogn)O(nlogn),所以才出现了瑞士轮坑死一片的情形 现在是要求最坏时间复杂度O(nlogn)所以可以放心使用sort!!! sort(首地址,尾地址,顺序) 下面是一个cmp的格式 1234bool cmp(typrename a, typename b){ return //表达式,表示排序的顺序规定} nth_element(fir,nth,sec,cmp) 平均O(nlogn)O(nlogn)O(nlogn) 例题P1068 NOIP2009 普及组 分数线划定 排序板子题,贴个代码 Code: 建议读者自己先Code 123456789101112131415161718192021222324252627282930313233 ...
作者信息
Announcement
Hi! This is xiaruize's Blog