首页 > 其他分享 >暑假集训CSP提高模拟7

暑假集训CSP提高模拟7

时间:2024-07-25 15:43:44浏览次数:7  
标签:20pts cnt int luogu 降序 mid 集训 暑假 CSP

暑假集训CSP提高模拟7

组题人: @KafuuChinocpp | @Chen_jr

\(T1\) P122. Permutations & Primes \(20pts\)

  • 原题: CF1844B Permutations & Primes

  • 假的构造策略,拿到了 \(20pts\) 。

    • 若 \(n\) 为奇数,则将 \(1\) 放在 \(\left\lceil \frac{n}{2} \right\rceil\) 的位置上,前一半质数降序放置,如果数量不够则合数降序放置,后一半降序放置。
    • 若 \(n\) 为偶数,则将 \(1\) 放在 \(\frac{n}{2}\) 的位置上,前一半质数降序放置,如果数量不够则合数降序放置,后一半降序放置。
  • 正解

    • 观察到 \(1\) 对整个 \(\operatorname{mex}\) 的影响较大,故让包含 \(1\) 的区间尽量多,由 普及模拟1 T1 Past 的结论当取 \(i=n-i+1\) 时取到最大值,把 \(1\) 放在 \(\left\lceil \frac{n}{2} \right\rceil\) 的位置,然后将 \(2,3\) 分别放在首尾,剩下的随便填即可。
    点击查看代码
    int main()
    {
        ll t,n,i,j,k;
        cin>>t;
        for(j=1;j<=t;j++)
        {
            cin>>n;
            if(n==1)
            {
                cout<<"1"<<endl;
            }
            else
            {
                if(n==2)
                {
                    cout<<"2 1"<<endl;
                }
                else
                {
                    cout<<"2 ";
                    for(i=2,k=4;i<=n/2;i++,k++)
                    {
                        cout<<k<<" ";
                    }
                    cout<<"1 ";
                    for(i=n/2+2;i<=n-1;i++,k++)
                    {
                        cout<<k  <<" ";
                    }
                    cout<<"3"<<endl;
                }
            }
        }
        return 0;
    }
    

\(T2\) P135. 树上游戏 \(29pts\)

  • 原题: [ARC116E] Spread of Information | luogu P3523 [POI2011] DYN-Dynamite

  • 部分分

    • \(10pts\) :当 \(k=n-1\) 时输出 \(1\) 。
    • \(10pts\) :当 \(k=1\) 时求出树的直径除以 \(2\) 并向上取整即可。
    • 随机 \(pts\) : rand() 大法好。
  • 正解

    • 答案显然具有单调性,考虑二分答案。
    • 设当前二分出的答案为 \(mid\) ,则等价于覆盖距离为 \(mid\) 的情况下进行选点。
    • 做法同 luogu P3942 将军令 ,考虑进行贪心,对于深度最深的叶节点将选择的点放在边界时,即取 \(mid\) 级祖先时,覆盖的范围一定最大。
    • 设 \(f_{x}\) 表示 \(x\) 到以 \(x\) 为根的子树内最远的没被覆盖的点的距离, \(g_{x}\) 表示 \(x\) 到以 \(x\) 为根的子树内最近被选的点的距离,状态转移方程为 \(\begin{cases} f_{x}=\max\limits_{y \in Son(x)}\{ f_{y}+1 \} \\ g_{x}=\min\limits_{y \in Son(x)}\{ g_{y}+1 \}\end{cases}\) ,
    • 当 \(g_{x}>mid\) 时以 \(x\) 为根的子树内所选的点覆盖不到自己,需要祖先节点进行覆盖,此时需要统计自己的贡献,即 \(f_{x}=\max(f_{x},0)\) ;当 \(f_{x}+g_{x} \le mid\) 时以 \(x\) 为根的子树内所选的点就能覆盖整棵子树,令 \(f_{x}=- \infty\) ;当 \(f_{x}=mid\) 说明 \(x\) 必须被选,令 \(f_{x}=- \infty,g_{x}=0\) ,选择点数加一。
    • 特判下根节点没有被覆盖的情况。
    点击查看代码
    struct node
    {
        int nxt,to;
    }e[400010];
    int head[400010],f[400010],g[400010],cnt=0,sum=0;
    void add(int u,int v)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        head[u]=cnt;
    }
    void dfs(int x,int fa,int k)
    {
        f[x]=-0x3f3f3f3f;
        g[x]=0x3f3f3f3f;
        for(int i=head[x];i!=0;i=e[i].nxt)
        {
            if(e[i].to!=fa)
            {
                dfs(e[i].to,x,k);
                f[x]=max(f[x],f[e[i].to]+1);
                g[x]=min(g[x],g[e[i].to]+1);
            }
        }
        if(g[x]>k)
        {
            f[x]=max(f[x],0);//等待祖先的覆盖
        }
        if(f[x]+g[x]<=k)//已被覆盖
        {
            f[x]=-0x3f3f3f3f;
        }
        if(f[x]==k)//强制覆盖
        {
            f[x]=-0x3f3f3f3f;
            g[x]=0;
            sum++;
        }
    }
    bool check(int mid,int k)
    {
        sum=0;
        dfs(1,0,mid);
        sum+=(f[1]>=0);//自己到自己也得算
        return sum<=k;	
    }
    int main()
    {
        int n,k,u,v,l=0,r,mid,ans=0,i;
        cin>>n>>k;
        r=n;
        for(i=1;i<=n-1;i++)
        {
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        while(l<=r)
        {
            mid=(l+r)/2;
            if(check(mid,k)==true)
            {
                ans=mid;
                r=mid-1;
            }
            else
            {
                l=mid+1;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(T3\) P127. Ball Collector \(0pts\)

\(T4\) P159. 满穗 \(20pts\)

总结

  • \(T1\) 赛时一直在想小区间怎么合并到大区间,猜结论时不会合理分析样例和性质导致结论猜假了。
  • \(T2\) 赛时和赛后转化题面转化得有点绕,很玄乎,没写完。

后记

  • 特殊奖励

  • \(T2\) 因为昨天 \(huge\) 看题后,体活来找学长时说了需要 \(CDQ\) 分治所以就临时换了这道题,正常的话应该和 暑假集训CSP提高模拟6 是一套题,还能和 \(T3\) 题面背景连上。

  • \(T4\) 夹带私货,剧透了《明末千里行》的部分情节。

标签:20pts,cnt,int,luogu,降序,mid,集训,暑假,CSP
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18323123

相关文章

  • 「模拟赛」暑期集训CSP提高模拟5(7.22)
    \(140pts,Rank24\)题目列表:简单的序列简单的字符串简单的困难的图论简单的序列\(100pts\)题意:gtm1514不喜欢序列。但是一天他拿到了一个序列。这个序列非常杂乱,于是gtm1514想要整理一下这个序列。但是由于他非常的菜,他只会进行一个操作:选择一个\(ai\),把它变......
  • CSP 2023 Round 2 游记
    Day?最近\(WHK\)下滑严重,月考排名掉到了\(50\)多了,想着等着这次\(CSP\)完就先退役,也就没想着拿奖去复习。Day0考前周五没怎么搞\(OI\),学校作业多到爆炸,晚自习老师一直讲课,都要睡着了,完事和WSL一起散散步就出校门了,结果WSL却跑回去跑800,说是为了运动会(,卷神。Day1-......
  • CSP 模拟 4
    T1WhiteandBlack原题ARC148CLightsOutonTree最小和无解都不用管,不能下改上,所以从上往下,遇到就反转。一定的观察后发现,当这个点的颜色与父亲不同时,会有贡献,然后直接就做完了。点击查看代码#include<bits/stdc++.h>typedeflonglongll;typedefunsignedlonglong......
  • CSP 模拟 3
    joke3579场,T1abc猜想([ARC111A]SimpleMath2)直接\(\bmod\c\),很难做,不难想到换一个和\(c\)有关的模数,\(c^2\)很好,因为它除以\(c\)再模上\(c\)后为\(0\)。求\(x=a^b(\bmod\c^2)\),\(a^b=k\cdotc^2+x\),除以\(c\)模\(c\)后,前面那个东西没了,只剩\(x\),所以答......
  • ccfcsp 201803.2 碰撞的小球 100分代码
    本题是一道小模拟规模小难度在碰撞检测在写模拟题时的思路应该是先找到应该储存的信息是哪些,抽象出来,应该模拟的方法是哪些。类似oop。includeusingnamespacestd;constintL=1000;structball{intp;chard=1;//只可能为1或-1,表示方向}b[L+1];intmain(){int......
  • 「模拟赛」暑期集训CSP提高模拟4(7.21)
    很祭的一次比赛,啥也不会。题目列表:A.WhiteandBlackB.WhiteandWhiteC.BlackandBlackD.BlackandWhiteA.WhiteandBlack\(0pts\)题意:给你一颗树,树根为1,初始所有点都是白色,每次询问给出一个点集,若把点集中的点全部染成黑色,问至少需要翻转多少个节点才能使整......
  • 2024暑假集训测试10
    前言比赛链接。这回挂的比较少,就T2唐了太长时间导致T4暴力没打完挂了\(60\),不过T4暴力给的非常多,但也并不好打,T3赛后因数据水安排重测,重测后还往上涨了\(2\)名,因为我的解法就是本着\(60pts\)部分分去的,没有卡掉我。T1花间叔祖原题。考虑另\(P=2\)则\(an......
  • 暑假集训CSP提高模拟6
    赛时在\(T2\)浪费时间太多,导致\(T4\)暴力没时间想了,总是想把\(T2\)这种题当大型分讨来做A.花间叔祖[ARC148A]modM观察性质可以发现,答案要么是1,要么是2,把是1的情况找出来剩下的就是2。考虑什么时候是1,如果一个数列模上一个数结果相同,那么他们的差一定是这个模数的整......
  • 暑假集训CSP提高模拟3
    暑假集训CSP提高模拟32/35反向挂了若干分又正向挂了若干T1abc猜想水,随便变形推个柿子糊个快速幂就好了T2简单的排列最优化题考虑只计算每次右移的\(delta\),我们发现一个点只会在到贡献为\(0\)的位置和序列开头会改变对\(delta\)的贡献,直接算就好,\(O(n)\)的T3简单......
  • [题解]P9755 [CSP-S 2023] 种树
    P9755[CSP-S2023]种树迟来的补题本题是让最小化所有树长到指定高度日期的最大值,于是想到二分答案。那么,对于一个给定的期限\(x\),如何判断是否能在这个日期内完成任务呢?首先我们发现前\(n\)天每天都要种树,那么假设我们已经知道了每个地块最晚哪个日期种树,能保证在期限\(x\)......