由于某些奇怪的原因,11月暂时被跳过了,不要在意这些细节……有缘分的话会回头看的。
BZOJ 1024 生日快乐
给一个长方形,切成n<=10份面积相等的长方形,要求这些长方形里最大的长宽比最小(也就是尽可能正方形),一开始不太理解,看了别人的博客,要使得每一块的面积相等,必然要使每一刀切下去的两块都是最终面积的倍数。由于n很小所以搜索的层数并不会很多。dfs(x,y,n)表示蛋糕xy分n块能够得到的最小的最大长宽比(类似dp的思想,有无后效性)。
BZOJ 1607 Patting Heads
这里好像是暴力的筛法,但其实并不是埃筛,因为埃筛不会访问合数。这里好像用到一个之前学过的求和式 $\sum\limits_{i=1}^{n}\lfloor\frac{n}{i}\rfloor=O(nlogn)$ ,也就是从1遍历到n,他们的所有倍数的次数加起来大概是 $O(nlogn)$ 。
最大流Dinic算法
学长去学习了最大流Dinic算法。由于本人不会故只能先抄抄别人的模板,先对比一下哪个模板更强。
学长的模板:
bool bfs(){ memset(dis,-1,sizeof(dis)); q[1]=0; dis[0]=1; h=0;t=1; while (h0 && dis[edge[i].to]<0) { dis[edge[i].to]=dis[j]+1; q[++t]=edge[i].to; } i=edge[i].next; } } if (dis[num]>0) return true; else return false;}long long dfs(int loc,long long low){ if(loc==num)return low; long long flow,cost=0; for(int i=cur[loc];i;i=edge[i].next) if(dis[edge[i].to]==dis[loc]+1) { flow=dfs(edge[i].to,min(low-cost,edge[i].v)); edge[i].v-=flow;edge[i^1].v+=flow; if(edge[i].v) cur[loc]=i; cost+=flow;if(cost==low)return low; } if(!cost)dis[loc]=-1; return cost;}long long dinic(){ long long temp=0; while (bfs()) { for (int i=0; i<=num; i++) cur[i]=head[i]; temp+=dfs(0,maxl); } return temp;}
其他:
发现C++的log函数的写法:以m为底的对数=log(n)/log(m)