学习笔记
学习笔记
STL容器
vector O(1)
vector</*任意类型*/>ve;
//支持随机访问
ve.size();//返回长度
ve.empty();//是否为空,yes返回1
ve.push_back();//加入数值
ve.pop_back();//删除末尾
ve.clear();//清空向量
vector</*类型*/>::iterator it;//迭代器,指针
it=ve.begin();//返回开头迭代器
*it==*ve.begin()==ve[0]==ve.front();
ve[ve.size()-1]==ve.back()==--*ve.end()
ve.end() && ve[N];//都是越界访问
deque O(1)
deque<类型>dq;
//支持随机访问
deque<int>::iterator it;
it=dq.begin();//返回迭代器
it=dq.end();//too
dq.front();
dq.back();
dq.push_front();
dq.push_back();
dq.pop_front();
dq.pop_back();
dq.clear();
dp.size();
dq.empty(); //判断容器是否为空
dq.size(); //返回容器中元素的个数
queue O(1)
queue</*类型*/>q;
q.push();
q.pop();
q.empty();
q.front();
q.back();
priority_queue O(log)
priority_queue</*类型*/>pq;//优先队列初始从大到小
priority_queue<int,vector<int>,greater<int> >pq;//从小到大,“> >”这两个中间要加上空格
//vector可以换成queue,是用什么来存,greater是从小到大,less是从大到小
pq.push();
pq.top();
pq.back();
map O(log)
map</*类型*/,/*类型*/>ad;//咱用字符串作下标
//size,empty,clear,begin,end同理,不提了
//ad.insert(),ad.erase();估计用不上
struct yhb{
int x,y;
bool operator < (yhb a) const{
return x<a.x;//结构体中的x全小于传入数值,从小到大排序
}
}
bool operator < (yhb a,yhb b){
return a.x<b.x;//在外面写如同cmp
}
//ad的key如果用结构体作第一维,需要重载小于运算符,map内部是一颗二叉树,不重载要寄
map</*类型*/,/*类型*/>::iterator it;//此时迭代器需要两个
ad.find();//若存在,返回指向迭代器,否则返回end()
map<yhb,int>::iterator it;
ad.insert(make_pair((yhb){1,2},1));//pair内置二元组,自带排序,关键字为第一位,结构体重载写挂了,可以试一试
//有些时候重载运算符报错,是出现int类型和struct之间的比较,阴间
ad[(yhb){1,2}]=1;
it=ad.find((yhb){1,2});//find()里是查询目标的key
printf("%d",ad[(yhb){1,2}]);//强制转型
it=ad.begin();
printf("%d",(*it).first.y);//哎,优先级又炸了,这访问方式,代码风格拉满
set O(log)
set</*类型*/>st;//自动排序,自动去重
st.insert()//插入
st.size();
st.empty();
set<int>::iterator it ;
it=st.find()//返回等于元素的迭代器
st.count(x)//返回等于x的元素个数
st.erase()//括号里放迭代器,删除
c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器
c++ stl容器set成员函数:clear()--清除所有元素
c++ stl容器set成员函数:count()--返回某个值元素的个数
c++ stl容器set成员函数:empty()--如果集合为空,返回true
c++ stl容器set成员函数:end()--返回指向最后一个元素下一个位置的迭代器
c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器
c++ stl容器set成员函数:erase()--删除集合中的元素
c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器
c++ stl容器set成员函数:get_allocator()--返回集合的分配器
c++ stl容器set成员函数:insert()--在集合中插入元素
c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数
c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值
c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器
c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器
c++ stl容器set成员函数:size()--集合中元素的数目
c++ stl容器set成员函数:swap()--交换两个集合变量
c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器
c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数
multiset O(logn)
stack O(1)
stack</*类型*/>st;
st.push();
st.pop();
st.top();//访问,不删除
st.empty();
st.size();
函数
离散化
unique
使用前要sort
a[1]=1,a[2]=1,a[3]=1,a[4]=2,a[5]=6,a[6]=6,a[7]=7;//1,1,1,2,6,6,7
int m=unique(a+1,a+8)-a-1;
printf("%d\n",m);
for(int i=0;i<=m;++i) printf("%d ",a[i]);
输出数据:
4
0 1 2 6 7
还是数据有说服力,自难忘
lower_bound+vecotr
for(int i=1;i<=9;++i) ve.push_back(i);
int m=lower_bound(ve.begin(),ve.end(),4)-ve.begin();
输出结果m为3,ve[m]为4
以下代码直接在Typora中编写,存在编译错误
for(int i=1;i<=N;++i) a[i]=b[i]=read();
sort(a+1,a+N+1);int m=unique(a+1,a+N+1)-a-1;//减一去掉0
for(int i=1;i<=m;++i) b[i]=lower_bound(a+1,a+m+1,b[i])-a;//不减一为了从一开始
b[i]的原值为a[b[i]]
memset memcpy
memset(a,0,sizeof(a));//只可以赋值0和-1,以及按位复制:0x3f
memcpy(a,b,sizeof(b));//将b里的内容往a中粘
数论
埃氏筛
int fl[MAXN];
for(int i=2;i<=N;++i)
for(int j=i*i;j<=N;j+=i) fl[j]=1;
欧拉函数
int phi[MAXN];
phi[1]=1;
for(int i=2;i<=N;++i) if(!phi[i]){
for(int j=i;j<=N;j+=i){
if(!phi[j]) phi[j]=j
phi[j]=phi[j]/i*(i-1);
}
}
线性筛
int fl[MAXN],pn=0,prime[MAXN];
for(int i=2;i<=N;++i){
if(!fl[i]) prime[++pn]=i;
for(int j=1;j<=pn&&prime[j]*i<=N;++j){
fl[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
矩阵
矩阵 方阵 矩形
$$
\begin{bmatrix}a&\cdots&b\\vdots&\ddots&\vdots\c&\cdots&d\end{bmatrix}
$$
运算
加法
C=A+B:$C_{i,j}=A_{i,j}+B_{i,j}$
减法 同上
乘法
恶心警告
首先 A的列数要等于B的行数:i行j列
$$
C_{i,j}=\sum_{k=1}^{n}a_{i,k}\times b_{k,j}
$$
总结
满足结合律和分配律,不满足交换律
一些关系式,递推式,数据范围特别大,如1e15,如果写递推dp,会T,但是每一次的转移,写成一个矩阵关系式:A,则有$dp_{i,j}=dp_{i-1,j}\times A$,而矩阵满足结合律,可以写个快速幂:$power(A,N-1)$,再乘上初始状态,复杂度:$M^3longN$
寄不了
莫比乌斯反演
数论分块
先来几个公式
$$
\left \lfloor\dfrac{a}{bc}\right\rfloor =\left\lfloor \dfrac{\left\lfloor\dfrac{a}{b}\right\rfloor}{c}\right\rfloor
$$
来个证明:a,b,c都为整数
$$
\dfrac{a}{b}=\left\lfloor\dfrac{a}{b}\right\rfloor+r\
\left\lfloor\dfrac{a}{b}\times\dfrac{1}{c}\right\rfloor=\left\lfloor\left(\left\lfloor\dfrac{a}{b}\right\rfloor+r\right)\times\dfrac{1}{c}\right\rfloor=\left\lfloor\dfrac{\left\lfloor\dfrac{a}{b}\right\rfloor}{c}+\dfrac{r}{c}\right\rfloor=\left\lfloor \dfrac{\left\lfloor\dfrac{a}{b}\right\rfloor}{c}\right\rfloor
$$
杂项
排列
$$
A_m^n=\frac{m!}{(m-n)!}
$$
组合数公式
$$
C_mn=C_m=\dbinom{m}{n}=\frac{m!}{n!(m-n)!}
$$
之前脑瘫了,这里$~n!$其实是选择的n个数打乱顺后的所有情况,全排列个数
隔板法?插板法?忘了
3个球,5个盒子,有多少种方法,很显然:$C_5^3$
一下全是$n>m$:
n个球,m个盒子,每个盒子至少装一个,有多少种方法?答案是$C_{n-1}^{m-1}$,首先,为确保所有球都装在盒子里,要1个盒子,剩下m-1个盒子,n个球,分成m-1块,有n-1个位置可选
n个球,m个盒子,盒子可以为空,有多少种方法?可以转化为将盒子和球放到一起,选择m个盒子,求选法,$C_{n+m-1}^{m-1}$
n个球,m个盒子,每个格子至少k个,先把球的个数刨除至少的$k\times n$,然后等同于可以为零的情况
卢卡斯定理
$$
Cn_m%p=C_{m%p}\cdot C_{m/p}^{n/p}%p
$$
这定理,明显敲递归
杨辉三角性质
第n行第i个的值为$C_n^i$
费马小定理
逆元定义:$a\times b \equiv 1 \pmod{P}$表示a是b在模数为p的情况下的逆元
简述:如果$\gcd(a,p)=1$,则$a^{p-1}\equiv1\pmod p$,那么$a^{p-2}\times a\equiv1\pmod p$,所以a在模p的情况下的逆元是$a^{p-2}$。
线性求阶乘的逆元
n!的逆元可以表示为${n!}{-1}$,乘上一个n,则变为${(n-1)!}$。
inv[MAXN-2]=power(fac[MAXN-2],mod-2);
for(int i=MAXN-3;i>=1;--i) inv[i]=inv[i+1]*(i+1)%mod;
连续平方公式
$$
12+22+···+N^2=\dfrac{N\cdot \left( N+1\right) \cdot \left( 2N+1\right) }{6}
$$
摸鱼一下
语文积累
-
星河滚烫,你是人间理想。
皓月清凉,你是人间曙光。
人海冷漠,你是人间炽热。
满眼星河,你是清风满月。
万事浮沉,你是人间归途。
众人平庸,你是人间星光。
世间无常,你是人间琳琅。
满树繁华,你是心之所往。
明月黯淡,你是最后曙光。
山花烂漫,你是昨夜晓凤。
人间苦咸,你是甜中透糖。
浩瀚银河,你是华星秋月。
夜幕将临,你是浩瀚月光。
春暖花开,你是心之所向。
众生皆苦,你是酸甜可口。
暗无天日,你是万丈光芒。
花灯初上,你是火树银花。
百无禁忌,你是一百零一。
明皓如初,你是一见钟情。
一眼惊鸿,你是三生有幸。
相思成画,你是一世芳华。
大地无声,你是惊心动魄。
日月星辰,你是朝朝暮暮。
山南水北,你是春花秋月。
-
日落跌入迢迢星野,人间忽晚,山河已秋
-
年少是夕阳,张扬的弥漫天边,青春是黄昏,落幕中还有希望。
-
时光清浅,岁月安暖。只愿心素如莲,人淡如菊。不以己悲,不以物喜。坐在阡陌红尘里,一手烟火,一手诗意,双手合十,做快乐的自己。
-
“我喜欢你,所以你走的路要繁花盛开,要人声鼎沸。”---《某某》
-
这里的一切都有始有终,却能容纳所有不期而遇和久别重逢。---《全球高考》
-
熬过了战争,熬过了国祸,却没熬过世俗。天地都认了,世俗却不允。---《一拜天地》
-
那些失散的,终究会在漫长的岁月里相拥着团圆;那些来迟的,终究会在阑珊的烟火里微笑着灿烂。---《一拜天地》
-
“风光无限是你,跌落尘埃也是你,重点是你,而不是怎样的你” ---《天官赐福》
-
美酒轻裘,挑灯走马,一生无牵挂。---《白色橄榄树》
-
你仗剑东游 ,我青衫白马过。---《将进酒》
-
红梅覆雪,兰舟笼香,一笑值千金。---《将进酒》
-
我本放逐臣,又为乱世雄。
圣贤招文席,英豪进吾觳。
萧关闻边笳,铁蹄逐寒水。
老将秣马行,瀌雪征衣重。
山雪明霜星,狼戾杀豺鹰。
归鞘掸袖尘,闲云濯红缨。
病仙携酒游,松月空弦音。
明堂欢宴起,破盏击筷饮。
且尽杯中酒,纵欢高殿里。
醉倒狂歌中……无须问功名。
---《将进酒》
-
江上春风停入梦,严岸忽见峫落雨,步入重生年华时,了吴黑夜雩星光,秦蜀共见百里山,解入少年无处行。---《破云》
-
停云霭霭,时雨濛濛,八表同昏,平陆成江。——《破云》
-
当你肩负警徽开枪时,法律条文与实际正义都在你扳机之下。---《破云》
-
云层低垂,落叶飞旋,巨大天幕下的恭州市华灯初上。他就这么一直一直地往前走,穿过摩肩接踵的人海,穿过硝烟弥漫的现场,穿过轰然坍塌的烈焰与分崩离析的未来;他走过三年孤独沉睡的时光,伤痕累累的灵魂从地狱中苏醒,向恶魔扣下了扳机。---《破云》
-
有些意外是意料之中,有些意外是意料之外,而你,就是我意料之外的意外。---《撒野》
-
我躲在断墙后面,偷看两个男孩徒手摘星,星星映在他们眼底,光却撒在我的身上。 后来他们把两个少年变成傀儡,星星撒落一地,断墙被摧毁,躲在后面的我如同小丑一般不知所措。 再后来断墙被女孩堆起,白昼代替黑夜,星星没了太阳代替,我的少年迎光而去。---《撒野》
-
别那么残忍
有人在燕尔新婚
有人江水中冰冷
别那么虔诚
江面上谁的灵魂
飘浮着不肯下沉
浮在江面上的黄昏
多么像 现世安稳

浙公网安备 33010602011771号