首页 > 其他分享 >2025省选模拟5

2025省选模拟5

时间:2025-01-15 19:10:21浏览次数:1  
标签:GCC 省选 ll cnt 2025 int pragma optimize 模拟

2025省选模拟5

题目来源: 2024省选联测11

\(T1\) HZTG5843. Giao 徽的烤鸭 \(31pts\)

  • 原题: Gym103428H city safety

  • 部分分

    • \(20 \%\) :爆搜。
    • \(15 \%\) :分讨菊花的三种情况。
    点击查看代码
    struct node
    {
        int nxt,to;
    }e[10010];
    int head[5010],a[5010],b[5010],dis[5010][5010],vis[5010],cnt=0,ans=0;
    vector<int>col[510][510];
    void add(int u,int v)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        head[u]=cnt;
    }
    void get_dis(int x,int fa,int rt)
    {
        col[rt][dis[rt][x]].push_back(x);
        for(int i=head[x];i!=0;i=e[i].nxt)
        {
            if(e[i].to!=fa)
            {
                dis[rt][e[i].to]=dis[rt][x]+1;
                get_dis(e[i].to,x,rt);
            }
        }
    }
    int get_p(int x,int n)
    {
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<col[x][i].size();j++)
            {
                if(vis[col[x][i][j]]==0)  return i-1;
            }
        }
        return n-1;
    }
    void dfs(int pos,int n,int sum)
    {
        if(pos==n+1)
        {
            for(int i=1;i<=n;i++)
            {
                if(vis[i]==1)
                {
                    sum+=b[get_p(i,n)];
                }
            }
            ans=max(ans,sum);
            return;
        }
        vis[pos]=1;
        dfs(pos+1,n,sum-a[pos]);
        vis[pos]=0;
        dfs(pos+1,n,sum);
    }
    int main()
    {
    #define Isaac
    #ifdef Isaac
        freopen("duck.in","r",stdin);
        freopen("duck.out","w",stdout);
    #endif
        int n,u,v,flag=1,sum=0,i;
        cin>>n;
        for(i=1;i<=n;i++)  cin>>a[i];
        for(i=0;i<=n-1;i++)  cin>>b[i];
        for(i=1;i<=n-1;i++)
        {
            cin>>u>>v;
            add(u,v);
            add(v,u);
            flag&=(u==i+1&&v==1);
        }
        if(flag==1)
        {
            for(i=2;i<=n;i++)  		sum+=max(b[0]-a[i],0);
            ans=max(ans,sum);  		sum=-a[1];
            for(i=2;i<=n;i++)  		sum+=max(b[1]-a[i],0);
            ans=max(ans,b[0]+sum);  sum=-a[1];
            for(i=2;i<=n;i++)		sum+=b[n-1]-a[i];
            ans=max(ans,b[n-1]+sum);
        }
        else
        {
            for(i=1;i<=n;i++)  get_dis(i,0,i);
            dfs(1,n,0);
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 正解

    • 设 \(f_{x,i}\) 表示以 \(x\) 为根的子树内离 \(x\) 距离 \(\ge i\) 的点都办会员卡的最大利润。
    • 转移时为保证 \(v_{i}\) 正确地加入决策集合需保证 \(i_{fa},i_{y} \ge i_{x}-1\) ,化简得到 \(i_{x}-1 \le i_{y} \le i_{x}+1\) 。
    • 为方便不办会员卡时的转移,整体将下标右移一位,令 \(f_{x,0}\) 表示 \(x\) 不办会员卡的最大利润。
    点击查看代码
    struct node
    {
        ll nxt,to;
    }e[10010];
    ll head[5010],a[5010],b[5010],f[5010][5010],cnt=0,n;
    void add(ll u,ll v)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        head[u]=cnt;
    }
    void dfs(ll x,ll fa)
    {
        for(ll i=1;i<=n;i++)  f[x][i]=b[i-1]-a[x];
        f[x][n+1]=-0x3f3f3f3f3f3f3f3f;
        for(ll i=head[x];i!=0;i=e[i].nxt)
        {
            if(e[i].to!=fa)
            {
                dfs(e[i].to,x);
                f[x][0]+=max(f[e[i].to][0],f[e[i].to][1]);
                for(ll j=1;j<=n;j++)
                {
                    f[x][j]+=max({f[e[i].to][j-1],f[e[i].to][j],f[e[i].to][j+1]});
                }
            }
        }
    }
    int main()
    {
    #define Isaac
    #ifdef Isaac
        freopen("duck.in","r",stdin);
        freopen("duck.out","w",stdout);
    #endif
        ll u,v,ans=0,i;
        cin>>n;
        for(i=1;i<=n;i++)  cin>>a[i];
        for(i=0;i<=n-1;i++)  cin>>b[i];
        for(i=1;i<=n-1;i++)
        {
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        dfs(1,0);
        for(i=0;i<=n;i++)  ans=max(ans,f[1][i]);
        cout<<ans<<endl;
        return 0;
    }
    

\(T2\) HZTG5844. A Dance of Fire and Ice \(20pts\)

  • 原题: Gym103428C Assign or Multiply
  • 观察到每次赋值相互独立,只需要处理乘法的情况。
  • 部分分
    • \(20pts\) :背包 \(O(np)\) 转移。

      点击查看代码
      ll pd[1000010],a[1000010],op,p;
      bitset<200010>ans,f[2];
      void add(ll x)
      {
          op^=1;  f[op]=f[op^1];
          for(ll i=f[op^1]._Find_first();i<=p;i=f[op^1]._Find_next(i))  f[op][i*x%p]=1;
      }
      void mul(ll x)
      {
          for(ll i=f[op]._Find_first();i<=p;i=f[op]._Find_next(i))  ans[i*x%p]=1;
      }
      int main()
      {
      #define Isaac
      #ifdef Isaac
          freopen("dance.in","r",stdin);
          freopen("dance.out","w",stdout);
      #endif
          ll n,i;
          scanf("%lld%lld",&p,&n);
          a[0]=f[op][1]=1;
          for(i=1;i<=n;i++)
          {
              scanf("%lld%lld",&pd[i],&a[i]);
              if(pd[i]==1)  add(a[i]);
          }
          for(i=0;i<=n;i++)
          {
              if(pd[i]==0)  mul(a[i]);
          }
          printf("%lld\n",ans.count());
          return 0;
      }
      
    • \(60pts\) :使用巴雷特约减优化上述取模过程。

      点击查看代码
      #include "MATH/Barrett.h"// oldyan 的 CP-template-main
      #endif
      int pd[1000010],a[1000010],op,p;
      bitset<200010>ans,f[2];
      int main()
      {
      #define Isaac
      #ifdef Isaac
          freopen("dance.in","r",stdin);
          freopen("dance.out","w",stdout);
      #endif
          int n,i,j;
          scanf("%d%d",&p,&n);
          OY::Barrett32 brt(p);
          a[0]=f[op][1]=1;
          for(i=1;i<=n;i++)
          {
              scanf("%d%d",&pd[i],&a[i]);
              if(pd[i]==1)
              {
                  op^=1;  f[op]=f[op^1];
                  for(j=f[op^1]._Find_first();j<=p;j=f[op^1]._Find_next(j))
                  {
                      f[op][brt.multiply(j,a[i])]=1;
                  }
              }
          }
          for(i=0;i<=n;i++)
          {
              if(pd[i]==0)
              {
                  for(j=f[op]._Find_first();j<=p;j=f[op]._Find_next(j))  
                  {
                      ans[brt.multiply(j,a[i])]=1;
                  }
              }
          }
          printf("%d\n",ans.count());
          return 0;
      }
      
  • 正解
    • 考虑通过原根及模意义下的对数将乘法转化为加法,然后在对数 \(\mod \varphi(p)\) 意义下进行背包 \(DP\) 转移。

    • 使用 bitset 加速,中途若转移后的状态与原状态相等则退出转移以此进行剪枝。

      点击查看代码
      ll lg[200010],cnt[200010];
      vector<ll>result;
      bitset<200010>f,g;
      void divide(ll n)
      {
          result.clear();
          for(ll i=2;i*i<=n;i++)
          {
              if(n%i==0)
              {
                  result.push_back(i);
                  while(n%i==0)  n/=i;
              }
          }
          if(n>1)  result.push_back(n);
      }
      ll qpow(ll a,ll b,ll p)
      {
          ll ans=1;
          while(b)
          {
              if(b&1)  ans=ans*a%p;
              b>>=1;
              a=a*a%p;
          }
          return ans;
      }
      bool check(ll x,ll p,ll phi)
      {
          if(qpow(x,phi,p)!=1)  return false;
          for(ll i=0;i<result.size();i++)
          {
              if(qpow(x,phi/result[i],p)==1)  return false;
          }
          return true;
      }
      ll min_pr(ll p,ll phi)
      {
          for(ll i=1;i<=p-1;i++)
          {
              if(check(i,p,phi)==true)  return i;
          }
          return -1;
      }
      int main()
      {
      #define Isaac
      #ifdef Isaac
          freopen("dance.in","r",stdin);
          freopen("dance.out","w",stdout);
      #endif
          ll p,phi,n,pr,pd,x,ans=0,i,j;
          scanf("%lld%lld",&p,&n);
          phi=p-1;
          divide(phi);
          pr=min_pr(p,phi);
          for(i=0,x=1;i<=phi-1;i++,x=x*pr%p)  lg[x]=i;
          for(i=1;i<=n;i++)
          {
              scanf("%lld%lld",&pd,&x);
              ans|=(x==0);
              if(pd==0)  f[lg[x]]=1;
              else  cnt[lg[x]]++;
          }
          f[0]=1;
          for(i=0;i<=phi-1;i++)
          {
              for(j=1;j<=cnt[i];j++)
              {
                  g=f|(f<<i)|(f>>(phi-i));
                  if(f==g)  break;
                  f=g;	
              }
          }
          for(i=0;i<=phi-1;i++)  ans+=f[i];
          printf("%lld\n",ans);
          return 0;
      }
      
    • Gym103428C Assign or Multiply 上要求恰好 \(n\) 次操作,只需要记录一下 \(\prod\limits_{op_{i}=1} a_{i}\) 并在最后计入答案,需要加火车头优化。

      点击查看代码
      #pragma GCC optimize(3)
      #pragma GCC target("avx")
      #pragma GCC optimize("Ofast")
      #pragma GCC optimize("inline")
      #pragma GCC optimize("-fgcse")
      #pragma GCC optimize("-fgcse-lm")
      #pragma GCC optimize("-fipa-sra")
      #pragma GCC optimize("-ftree-pre")
      #pragma GCC optimize("-ftree-vrp")
      #pragma GCC optimize("-fpeephole2")
      #pragma GCC optimize("-ffast-math")
      #pragma GCC optimize("-fsched-spec")
      #pragma GCC optimize("unroll-loops")
      #pragma GCC optimize("-falign-jumps")
      #pragma GCC optimize("-falign-loops")
      #pragma GCC optimize("-falign-labels")
      #pragma GCC optimize("-fdevirtualize")
      #pragma GCC optimize("-fcaller-saves")
      #pragma GCC optimize("-fcrossjumping")
      #pragma GCC optimize("-fthread-jumps")
      #pragma GCC optimize("-funroll-loops")
      #pragma GCC optimize("-fwhole-program")
      #pragma GCC optimize("-freorder-blocks")
      #pragma GCC optimize("-fschedule-insns")
      #pragma GCC optimize("inline-functions")
      #pragma GCC optimize("-ftree-tail-merge")
      #pragma GCC optimize("-fschedule-insns2")
      #pragma GCC optimize("-fstrict-aliasing")
      #pragma GCC optimize("-fstrict-overflow")
      #pragma GCC optimize("-falign-functions")
      #pragma GCC optimize("-fcse-skip-blocks")
      #pragma GCC optimize("-fcse-follow-jumps")
      #pragma GCC optimize("-fsched-interblock")
      #pragma GCC optimize("-fpartial-inlining")
      #pragma GCC optimize("no-stack-protector")
      #pragma GCC optimize("-freorder-functions")
      #pragma GCC optimize("-findirect-inlining")
      #pragma GCC optimize("-fhoist-adjacent-loads")
      #pragma GCC optimize("-frerun-cse-after-loop")
      #pragma GCC optimize("inline-small-functions")
      #pragma GCC optimize("-finline-small-functions")
      #pragma GCC optimize("-ftree-switch-conversion")
      #pragma GCC optimize("-foptimize-sibling-calls")
      #pragma GCC optimize("-fexpensive-optimizations")
      #pragma GCC optimize("-funsafe-loop-optimizations")
      #pragma GCC optimize("inline-functions-called-once")
      #pragma GCC optimize("-fdelete-null-pointer-checks")
      ll lg[200010],cnt[200010];
      vector<ll>result;
      bitset<200010>f,g;
      void divide(ll n)
      {
          result.clear();
          for(ll i=2;i*i<=n;i++)
          {
              if(n%i==0)
              {
                  result.push_back(i);
                  while(n%i==0)  n/=i;
              }
          }
          if(n>1)  result.push_back(n);
      }
      ll qpow(ll a,ll b,ll p)
      {
          ll ans=1;
          while(b)
          {
              if(b&1)  ans=ans*a%p;
              b>>=1;
              a=a*a%p;
          }
          return ans;
      }
      bool check(ll x,ll p,ll phi)
      {
          if(qpow(x,phi,p)!=1)  return false;
          for(ll i=0;i<result.size();i++)
          {
              if(qpow(x,phi/result[i],p)==1)  return false;
          }
          return true;
      }
      ll min_pr(ll p,ll phi)
      {
          for(ll i=1;i<=p-1;i++)
          {
              if(check(i,p,phi)==true)  return i;
          }
          return -1;
      }
      int main()
      {
      // #define Isaac
      #ifdef Isaac
          freopen("dance.in","r",stdin);
          freopen("dance.out","w",stdout);
      #endif
          ll p,phi,n,pr,pd,x,tmp=1,ans=0,i,j;
          scanf("%lld%lld",&p,&n);
          phi=p-1;
          divide(phi);
          pr=min_pr(p,phi);
          for(i=0,x=1;i<=phi-1;i++,x=x*pr%p)  lg[x]=i;
          for(i=1;i<=n;i++)
          {
              scanf("%lld%lld",&pd,&x);
              ans|=(x==0);
              if(pd==0)  f[lg[x]]=1;
              else
              {
                  tmp=tmp*x%p;
                  cnt[lg[x]]++;
              }
          }
          for(i=0;i<=phi-1;i++)
          {
              for(j=1;j<=cnt[i];j++)
              {
                  g=f|(f<<i)|(f>>(phi-i));
                  if(f==g)  break;
                  f=g;
              }
          }
          if(tmp!=0)  f[lg[tmp]]=1;
          for(i=0;i<=phi-1;i++)  ans+=f[i];
          printf("%lld\n",p-ans);
          return 0;
      }
      
    • 挂一下题解的做法。

\(T3\) HZTG5845. 挖掘机技术哪家强 \(60pts\)

  • 原题: Gym103428L shake hands

  • 部分分

    • \(60pts\) :建图后 Bron Kerbosch 求解最大团。
    点击查看代码
    int p[200010],R[80][200010],P[80][200010],ans=0;
    map<pair<int,int>,int> e;
    bool find(int u,int v)
    {
        return e.find(make_pair(u,v))!=e.end();
    }
    void Bron_Kerbosch(int dep,int r,int p)
    {
        if(p==0||dep>75)
        {
            ans=max(ans,r);
            return;
        }
        int u=P[dep][1];
        for(int i=1;i<=p;i++)
        {
            if(find(u,P[dep][i])==false)
            {
                for(int j=1;j<=r;j++)  R[dep+1][j]=R[dep][j];
                R[dep+1][r+1]=P[dep][i];
                int np=0;
                for(int j=1;j<=p;j++)
                {
                    if(find(P[dep][i],P[dep][j])==true)
                    {
                        np++;
                        P[dep+1][np]=P[dep][j];
                    }
                }
                Bron_Kerbosch(dep+1,r+1,np);
                P[dep][i]=0;
            }
        }
    }
    int main()
    {
    #define Isaac
    #ifdef Isaac
        freopen("excavator.in","r",stdin);
        freopen("excavator.out","w",stdout);
    #endif
        int n,m,x,i;
        cin>>n>>m;
        for(i=1;i<=n;i++)  p[i]=P[1][i]=i;
        for(i=1;i<=m;i++)
        {
            cin>>x;
            e[make_pair(p[x],p[x+1])]=e[make_pair(p[x+1],p[x])]=1;
            swap(p[x],p[x+1]);
        }
        Bron_Kerbosch(1,0,n);
        cout<<ans<<endl;
        return 0;
    }
    
  • 正解

总结

  • \(T1\) 赛时以为保证 \(v_{i}\) 正确地加入决策集合需要换根分讨多种情况,没想到能直接把限制条件由儿子节点继承而来。
  • \(T2\) 赛时瞪了 \(2h\) 才发现每次赋值相互独立的性质。

后记

  • \(T1\) 输出 \(\max(0,\sum\limits_{i=1}^{n}v_{n-1}-w_{i})\) 即可通过此题。

标签:GCC,省选,ll,cnt,2025,int,pragma,optimize,模拟
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18673623

相关文章

  • 2025 年宣布一件大事,Oracle 一键安装脚本开源了!
    大家好,这里是公众号DBA学习之路,致力于分享数据库领域相关知识。目录前言Oracle一键安装脚本脚本下载环境信息安装前准备Centos7.9Redhat8.10脚本参数一键安装11GR219C写在最后前言你没看错,就是Oracle数据库一键安装脚本部分开源了!之前很多朋友咨询我脚本......
  • 【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章ospf高级配置】理论
    文章目录【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章ospf高级配置】理论和实操14.1选择题在H3C设备上配置OSPF时,以下哪个命令用于启动OSPF进程?A.[H3C]ospfenableB.[H3C]ospf1C.[H3C]ospfstartD.[H3C]ospfprocessOSPF区域0......
  • 【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章ospf高级配置】理论
    文章目录14.1选择题解题思路和参考答案14.2理论题解题思路和参考答案14.3实操题解题思路和参考答案思科(Cisco)设备华为(Huawei)设备小米/锐捷(或其他支持标准CLI命令的设备)通过网络管理工具注意事项【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章o......
  • 2024,语音 AI 元年;2025,Voice Agent 即将爆发丨年度报告发布
      围绕VoiceAgent产品的研发、商业化和增长的完整生命周期,报告构建出一份VoiceAgent产业生态全景图。 2024年,AI与实时互动技术的结合达到了前所未有的高度。 5月,OpenAI发布了GPT-4o,并展示了其对话功能,仿佛电影《HER》中的智能助手走入了现实生活。 ......
  • 最新评测!18款2025年流行的项目管理软件,一网打尽!
    在数字化时代,项目管理软件已成为企业高效运作不可或缺的工具。从敏捷开发到传统瀑布式管理,从团队协作到任务追踪,这些软件以其强大的功能和灵活的应用场景,助力企业提升项目管理效率,确保项目按时交付。今天,我们将为您带来一场项目管理软件的盛宴,评测18款在2025年备受瞩目的产品,......
  • 2025/1/15 力扣每日一题(3066. 超过阈值的最少操作数 II)
    来源:LeetCode链接:https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/description/?envType=daily-question&envId=2025-01-15题目:给你一个下标从0开始的整数数组nums和一个整数k。一次操作中,你将执行:选择nums中最小的两个整数x和y......
  • 2025-1-15-十大经典排序算法 C++与python
    文章目录十大经典排序算法比较排序1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序非比较排序8.计数排序9.桶排序10.基数排序十大经典排序算法十大经典排序算法可以分为比较排序和非比较排序:前者包括冒泡排序、选择排序、插......
  • About Myself ver.2025
    前言Jabber如果有人有这个闲工夫的话,上一个关于是写于2023.9月的,那时的我刚刚步入大学。一眨眼,现在就已经大二上学期结束了,时间过的真快啊。在过去的一年半里,这博客基本处于半报废的状态大一上开学写过一点点时间,大一下开学写过一点点时间,但都没有坚持下来本人呢在客观上,没......
  • 2025年——29款顶级项目管理工具,提升工作效率必备!
    在2025年的数字化时代,项目管理已成为企业成功不可或缺的一环。随着技术的飞速发展,各种项目管理工具应运而生,旨在帮助团队更高效、更准确地完成任务。今天,我们将为大家介绍30款顶级项目管理工具,这些工具不仅涵盖了从任务分配到资源管理的各个方面,还能通过智能化手段优化工作流程,提......
  • 2025年flask电子病历管理系统 程序+论文 可用于计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着信息技术的飞速发展,电子病历管理系统在医疗领域的应用日益广泛。关于电子病历管理系统的研究,现有文献主要集中在系统的架构设计、数据......