NOIP2024加赛2

NOIP2024加赛2

题目来源: 2023NOIP A层联测18

\(T1\) HZTG5733. 新的阶乘 \(100pts\)

  • 预处理素数后直接对 \(1 \sim n\) 进行质因数分解因为有太多冗余枚举导致无法通过。

  • 考虑枚举最终形式。具体地,从质因数的角度入手,设当前枚举的质数为 \(p\) ,暴力求出 \(ip\)\(p\) 的指数即可。

  • 时间复杂度为 \(1 \sim n\) 中每个数质因数分解后的各指数之和 \(=O(n \log n)\) ,在 \(1s\) 内仅能处理 \(3 \times 10^{7}\) 以内的数据。

    • 时间复杂度在于暴力求 \(ip\)\(p\) 的指数。
    点击查看代码
    ll prime[700010],c[700010],len=0;
    bool vis[10000010];
    void isprime(ll n)
    {memset(vis,0,sizeof(vis));for(ll i=2;i<=n;i++){if(vis[i]==0){len++;prime[len]=i;}for(ll j=1;j<=len&&i*prime[j]<=n;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){break;}}}
    }
    ll ask(ll n,ll p)
    {ll ans=0;while(n%p==0){ans++;n/=p;}return ans;
    }
    int main()
    {freopen("factorial.in","r",stdin);freopen("factorial.out","w",stdout);ll n,cnt,mul,i,j;scanf("%lld",&n);isprime(n);for(i=1;i<=len;i++){for(j=1;prime[i]*j<=n;j++){c[i]+=(ask(j,prime[i])+1)*(n-prime[i]*j+1);}}printf("f(%lld)=",n);for(i=1;i<=len;i++){printf("%lld",prime[i]);if(c[i]!=1){printf("^%lld",c[i]);}if(i!=len){printf("*");}}fclose(stdin);fclose(stdout);return 0;
    }	
    
  • 官方题解中省去了暴力求指数的一步。

\(T2\) HZTG5734. 博弈树 \(80pts\)

  • 部分分

    • \(80pts\) :暴力建出博弈的搜索树,因为状态数规模为 \(O(n^{2})\) ,加个记忆化即可,可能需要 \(O(1)\) 的求 \(\operatorname{LCA}\) (?)。
    点击查看代码
    struct node
    {int nxt,to;
    }e[200010];
    int head[100010],dfn[100010],dep[100010],cnt=0,tot=0;
    unordered_map<int,bool>f[100010];
    void add(int u,int v)
    {cnt++;e[cnt].nxt=head[u];e[cnt].to=v;head[u]=cnt;
    }
    int sx_min(int x,int y)
    {return dfn[x]<dfn[y]?x:y;
    }
    struct ST
    {int fminn[100010][20];void init(int n){for(int j=1;j<=log2(n);j++){for(int i=1;i+(1<<j)-1<=n;i++){fminn[i][j]=sx_min(fminn[i][j-1],fminn[i+(1<<(j-1))][j-1]);}}}int query(int l,int r){int t=log2(r-l+1);return sx_min(fminn[l][t],fminn[r-(1<<t)+1][t]);}
    }T;
    void get_dep(int x,int fa)
    {tot++;dfn[x]=tot;dep[x]=dep[fa]+1;T.fminn[tot][0]=fa;for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=fa){get_dep(e[i].to,x);}}
    }
    int lca(int u,int v)
    {if(dfn[u]>dfn[v]){swap(u,v);}return (dfn[u]==dfn[v])?u:T.query(dfn[u]+1,dfn[v]);
    }
    int get_dis(int u,int v)
    {return dep[u]+dep[v]-2*dep[lca(u,v)];
    }
    bool dfs(int x,int last,int n)
    {if(f[x].find(last)!=f[x].end()){return f[x][last];}for(int i=1;i<=n;i++){int d=get_dis(x,i);if(d>last&&dfs(i,d,n)==false){return f[x][last]=true;}}return f[x][last]=false;
    }
    int main()
    {freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);int n,m,u,v,i;cin>>n>>m;for(i=1;i<=n-1;i++){cin>>u>>v;add(u,v);add(v,u);}get_dep(1,0);T.init(n);for(i=1;i<=m;i++){cin>>u;if(dfs(u,0,n)==true){cout<<"Alice"<<endl;}else{cout<<"Bob"<<endl;}}fclose(stdin);fclose(stdout);return 0;
    }	
    
  • 正解

    • 若节点 \(x\) 是直径的端点,那么直接判定 Alice 必胜。否则谁先移动到直径的端点谁就输。
    • 考虑删去所有直径的端点(一定是叶子节点),若节点 \(x\) 是删完后的树的直径端点,那么 Alice 也是必胜的。因为 Alice 可以将点移动到删完后的树的另一个直径端点,而 Bob 就只能移到原树的直径端点上,从而得到 Alice 必胜。
    • 考虑模拟删叶子的过程,若删到最后只剩一个点说明在这个点时 Bob 是必胜的,否则 Alice 一定可以通过不断将点移动到下一层的直径端点取得胜利(对于 Bob 的干扰, Alice 可以通过利用直径的最长性进行反制)。
    • 而最后剩下的这个点一定是直径的中点(直径长度为奇数时),预处理即可。
    点击查看代码
    struct node
    {int nxt,to;
    }e[200010];
    int head[200010],dep[200010],fa[200010],cnt=0;
    vector<int>d;
    void add(int u,int v)
    {cnt++;e[cnt].nxt=head[u];e[cnt].to=v;head[u]=cnt;
    }
    void dfs(int x,int father)
    {fa[x]=father;dep[x]=dep[father]+1;for(int i=head[x];i!=0;i=e[i].nxt){if(e[i].to!=father){dfs(e[i].to,x);}}
    }
    int main()
    {freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);int n,m,u,v,rt1=0,rt2=0,i;cin>>n>>m;for(i=1;i<=n-1;i++){cin>>u>>v;add(u,v);add(v,u);}dfs(1,0);for(i=1;i<=n;i++){rt1=(dep[i]>dep[rt1])?i:rt1;}dfs(rt1,0);for(i=1;i<=n;i++){rt2=(dep[i]>dep[rt2])?i:rt2;}while(rt2!=0){d.push_back(rt2);rt2=fa[rt2];}for(i=1;i<=m;i++){cin>>u;if(d.size()%2==0||d[d.size()/2]!=u){cout<<"Alice"<<endl;}else{cout<<"Bob"<<endl;}}fclose(stdin);fclose(stdout);return 0;
    }	
    

\(T3\) HZTG5735. 划分 \(9pts\)

  • 部分分

    • 测试点 \(1 \sim 2\) :爆搜。
    • 测试点 \(9 \sim 12\)
      • 设第一个 \(1\) 出现的位置为 \(pos\) 。那么最大值一定为 \(s_{pos \sim n}\) ,因为 \([pos,n]\) 中任意断开就会导致最大值变小。方案数仅会由前面的 \(0\) 决定,即 \(\sum\limits_{i=k}^{pos}\dbinom{pos-1}{i-1}\)
      • 若不存在 \(1\) ,则最大值为 \(0\) ,方案数为 \(\sum\limits_{i=k}^{n}\dbinom{n-1}{i-1}\)
    点击查看代码
    const ll p=998244353;
    ll inv[2000010],jc[2000010],jc_inv[2000010],ans=0,cnt=0;
    char s[2000010];
    ll ask(ll l,ll r)
    {ll ans=0;for(ll i=l;i<=r;i++){ans=(ans*2+s[i]-'0');}return ans;
    }
    ll work(ll l,ll r)
    {ll ans=0;for(ll i=l;i<=r;i++){ans=(ans*2%p+s[i]-'0')%p;}return ans;
    }
    void dfs(ll pos,ll n,ll k,ll sum,ll num,ll last)
    {if(pos==n){num++;sum+=ask(last+1,n);if(num>=k){if(sum>ans){ans=sum;cnt=1;}else{if(sum==ans){	cnt++;}}}}else{dfs(pos+1,n,k,sum,num,last);dfs(pos+1,n,k,sum+ask(last+1,pos),num+1,pos);}
    }
    ll C(ll n,ll m,ll p)
    {return (n>=m&&n>=0&&m>=0)?(jc[n]*jc_inv[n-m]%p)*jc_inv[m]%p:0;
    }
    int main()
    {freopen("divide.in","r",stdin);freopen("divide.out","w",stdout);ll n,k,pos=0,sum=0,i;cin>>n>>k;for(i=1;i<=n;i++){cin>>s[i];pos=(pos==0&&s[i]=='1')?i:pos;}if(pos>k||pos==0){	inv[1]=1;jc[0]=jc_inv[0]=jc[1]=jc_inv[1]=1;for(i=2;i<=n;i++){inv[i]=(p-p/i)*inv[p%i]%p;jc[i]=jc[i-1]*i%p;jc_inv[i]=jc_inv[i-1]*inv[i]%p;}if(pos==0){for(i=k;i<=n;i++){sum=(sum+C(n-1,i-1,p))%p;}cout<<0<<" "<<sum<<endl;}else{for(i=k;i<=pos;i++){sum=(sum+C(pos-1,i-1,p))%p;}cout<<work(pos,n)<<" "<<sum<<endl;}}else{dfs(1,n,k,0,0,0);cout<<ans%p<<" "<<cnt%p<<endl;}fclose(stdin);fclose(stdout);return 0;
    }	
    
  • 正解

    • 考虑不保证 \(\forall i \in [1,k],s_{i}=0\) 时怎么做。
    • 最优解的划分方案一定形如选出一段 \(n-k'+1(k' \ge k-1)\) 单独作为一段,剩下的每个数单独作为一段。
    • 因为 \(1\) 的数量是一定的,所以所有的构造方案对应的 \(n-k'+1(k' \ge k-1)\) 这段数的前 \(n-k\) 位一定相同(若长度不够 \(n-k+1\) 则先在前面补 \(0\) 补成长度为 \(n-k+1\) 的段,可以证明这并不影响结果)。
    • 考虑二分哈希找到最大的划分点,然后哈希判断有多少个其他划分点的前 \(n-k\) 位与其相等。
      • 二分哈希的写法类似 暑假集训CSP提高模拟24 D P240.最短路 。
    • 需要特判 \(n=k\) 时方案数为 \(1\)
    点击查看代码

\(T4\) HZTG5736. 灯笼 \(0pts\)

  • 原题: luogu P9312 [EGOI2021] Lanterns / 灯笼

  • 正解

总结

  • \(T3\) 没有想 \(\forall i \in [1,k],s_{i}=0\)\(15pts\) 部分分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827723.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用处多多!信创PostgreSQL认证证书含金量

PostgreSQL是目前讨论比较多的数据库技术,国内很多大的企业都在开发基于PostgreSQL的数据库产品,比如腾讯云TDSQL-PG版、阿里云PolarDB-PG版、人大金仓等等,考取PostgreSQL数据库证书对个人在数据库领域的职业发展具有多方面的积极作用。以下是对其用处的详细分析: ​ 一、…

南沙C++信奥赛陈老师解一本通题 1225:金银岛

​【题目描述】某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有ss个种类, 每种金属重量不同,分别为n1,n2,...,nsn1,n2,...,ns,同时…

精准、智能、高效:AI平台如何提升医疗数据处理效率50%

思通数科的大模型是一款集成自然语言处理、多模态分析与知识图谱技术的智能系统,专为提升行业信息处理效率和决策支持而设计。该模型依托深度学习与数据驱动,能够在合同审查、智能问答、医疗文本处理等场景中实现精准的文本分类、信息抽取与风险识别。特别在多模态数据处理方…

MySQL 8.0 执行COUNT()很慢原因分析

MySQL 8.0 执行COUNT()很慢原因分析 1.1 问题描述 线上 MySQL8.0.32 环境在执行 SELECT COUNT (1) FROM t0 获取表行数很慢,同样场景下该 SQL 在 MySQL5.7 环境很快就能拿到结果 1.2 问题复现 测试版本:8.0.25 MySQL Community Server - GPL 和 5.7.21-log MySQL Community S…

DAC控制LM358输出4~20ma电路

在带负载0~800Ω左右,电流并不会发生偏差使用注意事项有些时候LM358内部的运放不一定都使用到在使用画PCB和原理图的时候要注意输入端不能直接接地,否则芯片会发烫。并且给出TI的LM358部分说明以及未使用时的处理方法。

mac 关闭所有浏览器的前进后退功能

系统偏好设置 => 触控板 => 更多手势 => 在页面之间轻扫 取消勾选即可。如下图所示:

科陆电子:从卷到赢,连接型CRM助力营销服全链路质、效双飞跃

深圳市科陆电子科技股份有限公司是美的集团旗下企业,于1996年在深圳成立,主板上市企业(2007年在深交所上市,股票代码002121)、国家高新技术企业,拥有国家认定企业技术中心和多个国家级、省级技术中心、实验室。公司主营业务聚焦在智能电网和新型电化学储能两大板块,战略愿景是成…

bug解决记录:前端解密后的中文是问号的解决办法

最近的项目中,遇到了这个问题,我们的容灾环境要进行演练,但是进行切换到容灾环境的时候,发现返回的中文都是?问号 解决思路: 1.先看下接口的请求头和响应头是不是指定了这个编码格式。排查出来发现都是有的 2.看下解密和加密是否有指定编码格式设置字符 byte[] bytes = s…

sqlserver 数据库连接异常 SqlClient.SqlException (0x80090325): 证书链是由不受信任的颁发机构颁发的

异常 解决方案: 数据库连接增加“TrustServerCertificate=True;” 完整连接Server=.;Database=TestDb;User Id=sa;Password=aaaaa;Encrypt=True;TrustServerCertificate=True;TrustServerCertificate=True 表示这将强制客户端在不验证的情况下信任证书参考

Frequent Directions

目录概Frequent DirectionsFrequent Directions over Slidding Windows代码Ghashami M., Liberty E., Phillips J. M. and Woodruff D. P. Frequent directions : Simple and deterministic matrix sketching. 2015.Yin H., Wen D., Li J., Wei Z., Zhang X., Huang Z. and Li …

Nuxt.js 应用中的 prerender:routes 事件钩子详解

title: Nuxt.js 应用中的 prerender:routes 事件钩子详解 date: 2024/11/6 updated: 2024/11/6 author: cmdragon excerpt: prerender:routes 是 Nuxt.js 中的一个钩子,允许开发者在预渲染过程中扩展要预渲染的路由列表。这对于静态站点生成(SSG)尤为重要,开发者可以根据…