追逐学长的背影 - 2015年12月

由于某些奇怪的原因,11月暂时被跳过了,不要在意这些细节……有缘分的话会回头看的。

https://www.cnblogs.com/DaD3zZ-Beyonder/archive/2015/12.html

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 (h<t)  
        {
            int j=q[++h],i=head[j];
            while (i)
                {
                    if (edge[i].v>0 && 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;
}
View Code

 其他:

发现C++的log函数的写法:以m为底的对数=log(n)/log(m)

posted @ 2019-03-05 17:38  韵意  阅读(125)  评论(0编辑  收藏  举报