zoukankan      html  css  js  c++  java
  • NOIP模拟测试5「星际旅行·砍树·超级树」

    星际旅行

    0分

    瞬间爆炸。

    考试的时候觉得这个题怎么这么难,

    打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回,

    关键是同一子树会贡献,不同子树也会贡献。

    这还不是欧拉图欧拉路问题,awsl

    然后我就放弃了这个题

    考完试看题解,tm一个大水题

    虽然好像不算水,

    思考两个点之间因为连接的是无向边,所以所有点入度出度都为2。

    先不考虑自环

    如果把两个点之间无向边拆成两个有向边,那么问题就变成去掉两个边使原图存在欧拉路。

    于是乎,问题就变得很简单了

    如果有自环

    可以去掉两个自环,或者去掉一个自环和一个边

    砍树

    做砍树时问大佬说,“这是一个数论分块”模板题

    我:???

    原来只有我没学过数论分块吗?

    https://www.cnblogs.com/0xfffe/p/9648943.html

    略微理解了理解,写的非常清楚

    你说这是向下取整,不是向上取整,砍树要向上取整,那篇博客不适用于砍树?

    确实不适用

    我们要分块的是等式右面的$sum_{i}^{n} a[i]  +k$除以d

    因为C是固定的,所以这是一个分段函数,我们要处理的是不同的右面的值最后再跟左面对应

    我们然后f存下这一段具体的值,

    r存下具体右端点

    然后就完了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define A 11000000
    ll l=1,r,n,m,a[A],dl[A],R[A],f[A],zz=0,num=0,ans=0,sum=0;
    void precl()
    {
        while(1){
            if(!(sum/l)) break;
            r=sum/(sum/l);
            f[++num]=sum/r;
            R[num]=r;
            l=r+1;
        }
    }
    
    int main(){
        scanf("%lld%lld",&n,&m);
        sum=m;
        for(ll i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            sum+=a[i];
        }
        precl();
        for(ll j=1;j<=num;j++)
        {
            ll t=0;
            for(ll i=1;i<=n;i++){
                t+=ceil((double)a[i]/(double)R[j]);
            }
    //        printf("f=%lld R=%lld
    ",f[j],R[j]);
            if(t<=f[j]) ans=R[j];
        }
        cout<<ans<<endl;
    }

    以下是我完全错误的解释

    设$k imes i-p=N$ 向上取整设

    $large{lceil frac N{i+d} ceil}=k$

    于是$k imes (i+d)-p2=N$

    同样得出p2=p+kd

    就是照猫画虎的一个过程

    底下我不具体推了,

    $large left lceil frac N{left lfloor frac Ni ight floor } ight ceil$

    所以对砍树这道题来说,这确实是个模板题,分析发现这是一个分段函数,维护每一段大小相同,维护l,r下一个l=r+1

    具体来说

    $large left lceil frac {a[i]}{d} ight ceil$不是为我们具体分块的值

    $large lfloor frac Ni floor$才是

    然后等式右面是$sum_{i}^{n} a[i]  +k$再除以d

    这个N就是$sum_{i}^{n} a[i]  +k$

    那么这个题就迎刃而解了。

    超级树

     等我AC了可怜与超市

    我已没有下降的余地
  • 相关阅读:
    【职业规划】一位资深程序员大牛给予Java初学者的学习路线建议
    一个断点调试的小技巧
    无穷分数
    Spring事务异常回滚,捕获异常不抛出就不会回滚
    理解Servlet和Servlet容器、Web服务器等概念
    图解红黑树及Java进行红黑二叉树遍历的方法
    Majority Element
    Factorial Trailing Zeroes
    Valid Parentheses
    House Robber
  • 原文地址:https://www.cnblogs.com/znsbc-13/p/11209930.html
Copyright © 2011-2022 走看看