集训总结
DAY1
第一天原本是讲分治和概率期望的,不过老师讲概率期望就把今天一整天讲掉了(其实老师已经做好明天还要继续讲的准备了).## 标题
首先讲一下概率期望的基本知识:
- E ( x ) E(x) E(x) 表示事件x的期望值- E ( X ) = S u m [ P ( X = i ) ∗ i ] E(X)=Sum[ P(X=i)*i ] E(X)=Sum[P(X=i)∗i]- P ( x ) P(x) P(x) 表示事件x发⽣的概率- 独⽴事件:互相不影响的事件,满⾜ P ( A B ) = P ( A ) P ( B ) P(AB)=P(A)P(B) P(AB)=P(A)P(B)
- 对于独⽴事件,我们有 E ( A B ) = E ( A ) E ( B ) E(AB)=E(A)E(B) E(AB)=E(A)E(B)
常用公式:
- ∑ i = 0 n x i = ( 1 − x n + 1 1 − x ) \sum_{i=0}^nx^i=\left(\frac{1-x^{n+1}} {1-x}\right) ∑i=0nxi=(1−x1−xn+1)
- E ( X + Y ) = E ( X ) + E ( Y ) E(X+Y)=E(X)+E(Y) E(X+Y)=E(X)+E(Y)
常用技巧:
- 对于离散变量x(就是整数), P ( x = k ) = P ( x < = k ) − P ( x < = k − 1 ) P(x=k)=P(x<=k)-P(x<=k-1) P(x=k)=P(x<=k)−P(x<=k−1)- 任何一个整数n都可以写成 ∑ i = 1 n 1 \sum_{i=1}^n1 ∑i=1n1
拿球问题
- 箱⼦⾥有 n 个球 1…n,你要从⾥⾯拿 m 次球,拿了后不放回,求取出的数字之和的期望
- 箱⼦⾥有 n 个球 1…n,你要从⾥⾯拿 m 次球,拿了后放回,求取出的数字之和的期望
- 箱⼦⾥有 n 个球 1…n,你要从⾥⾯拿 m 次球,拿了后以p1 的概率放回,以 p2 的概率放回两个和这个相同的球,求取出的数字之和的期望.
第二题最简单,显然答案是 m ∗ ( 1 + n ) / 2 m*(1+n)/2 m∗(1+n)/2 让我们感性地分析一下第一题(显然是不会理性分析),因为每个数字都是平等的,那么每次选取都是有相同的几率被拿走的,所以显然这就相当于第2题,答案相同了(显然这两个字概括了很多内容)。 第三题也类似,对于每一个数字那什么的几率的都一样,所以相当于没拿。
DAY2
今天讲分治和二分还有图论…
CDQ分治相对于普通的分治的不同之处就在于他可以顶替复杂的高级数据结构,而且常数较小,但必须离线。
它的主要思想还是分治的思想,即递归处理小范围信息,之后将处理的信息合并上传。
一般来说,都是先处理左区间信息,之后用左区间更新右区间,顺便更新答案,然后处理右区间,之后再将两个区间的信息合并。
二分图匹配
在一个图中所有的点可以分为两组,同一组中没有边,所有的边都跨越了两个组,这个图就是二分图。
二分图匹配: 设G=(V,E)是一个图,M是E的一个子集,如果M不含环且任意两边都不相邻,则称M为G的一个匹配。
----------------摘自百度百科
而匹配二分图的算法就是匈牙利算法。
匈牙利算法的基本流程其实就是查找增广路的过程,然后通过异或操作来更新最大匹配。
DAY3
自闭,无话可说
DAY4
今天ACM,5个小时11道题,做到自闭,直至弃疗
开局先做A题,一道普通的暴力题被我们想到了中国剩余定理(虽然也可以解),搞来搞去还是用了几分钟先把第B道题做掉了。
然后去做F题,打了一个暴力,没有过,然后尝试用一个
4000
∗
4000
4000*4000
4000∗4000的数组来记忆化在
4000
∗
4000
4000*4000
4000∗4000之内的答案(这个
4000
∗
4000
4000*4000
4000∗4000是我们尝试了好多次才试出来的,于是有好多罚时),
4000
∗
4000
4000*4000
4000∗4000外的答案直接枚举。可是一直卡在第23个点,要么MLE.要么TLE。
放弃F题,去做G,原本以为这是道水题,推出式子,结果发现样例没过,才发现题目看错了 ,于是再次放弃。
第I题,rfy想出用拓扑排序做,做啊做,过了样例,可是到了第二个点就错了,发现可能有环,于是又用了tarjan缩点,然后就是一坨代码,找都找出到错来。
后面2个小时找错,直至弃疗。
DAY5
网络流,awa
听起来好恐
网络流应该算是图论的一种分支吧,存储方式和图相同。
有两个特殊的源点,汇点, 每条边上都有非负的权值(单向)。
结论1:增广后流量增加
显然
结论2:任意流F的流量不超过任意割的容量,即
∣
F
∣
<
=
c
(
S
,
T
)
|F|<=c(S,T)
∣F∣<=c(S,T)
最大流最小割定理:对于一个网络!下面三个命题总是等价
- 流 F F F是 G G G的最大流
- 当前流F的残量网络 G F G_F GF上不存在增广路
- 存在某个割使得
∣
F
∣
=
c
(
S
,
T
)
|F|=c(S,T)
∣F∣=c(S,T)成立。由结论2可知,满足条件的割必定是最小割。
求最大流算法:
FF算法
int Ford_Fullkerson(int s, int t) {
int totalflow = 0;//从s到达t的最大网络流
int flow;
do {
for (int i = 0; i < vertexnum; i++) {//bfs之前将以下数据全部清空
while (!path[i].empty()) path[i].pop_back();
minflow[i] = 0;
vis[i] = false;
}
flow = bfs(s, t);//bfs进行寻找增广路径,并return增广路径中最小flow
if (flow != -1) {//如果找到增广路径
totalflow += flow;
updatenetflow(flow, path[t]);//更新残余网络
}
} while (flow != -1);
return totalflow;
}
复杂度
O
(
∣
E
∣
∣
F
O(|E||F
O(∣E∣∣F*
∣
)
|)
∣)
EK算法
int EK(int src,int des)
{
int maxflow=0;
while(bfs(src,des)){
int minflow=INF;
for(int i=des;i!=src;i=pre[i])
minflow=MIN(minflow,map[pre[i]][i]);
for(int i=des;i!=src;i=pre[i])
map[pre[i]][i]-=minflow,
map[i][pre[i]]+=minflow;
maxflow+=minflow;
}
return maxflow;
}
复杂度
O
(
V
E
2
)
O(VE^2)
O(VE2)
Dinic算法
在EK算法的基础上,将每次寻找一条增广路优化为每次计算出一个增广网络。
- 在残量网络中,若两个端点间的最短路恰好为1,就称之为可行边
- 由所有可行边构成的图(最短路图),称之为可行网络
- 增光完一个阻塞流后,d(t)必增,因而最多增广 O ( V ) O(V) O(V)次
int dfs(int x,int sum)
{
if(x==t||!sum) return sum;
int res=0;
for(int i=head[p];i;i=next[i])
{
int y=ver[i];
head[x]=i;
if(d[y]==d[x]+1&&w[i])
{
int tmp=dfs(v,min(sum-res,w[i])sd);
res++tmp;
w[i]-=tmp,w[rec[i]]+=tmp;
}
if(res==sum) return res;
}
if(!res) d[x]=-1;
return res;
}
复杂度 O ( V 2 E ) O(V^2E) O(V2E)
DAY6
动态规划
GCD Couting
套路题,看到题解就一下子很明郎了。
边转移边更新最终答案就好了。
遍历部分代码
void dfs(int x,int y)
{
for(int i=head[x];i;i=next[i])
{
int y=ver[i];
dfs(y,x);
for(int j=0;j<p[x].size();j++)
for(int k=0;k<p[y].siz();k++)
{
if(p[x][j]!=p[y][k]) continue;
ans=max(ans,f[x][j]+f[y][k]);
f[x][j]=max(f[x][j],f[y][k]+1);
}
}