多校A层冲刺NOIP2024模拟赛21

多校A层冲刺NOIP2024模拟赛21

\(T1\) A. 送信卒 \(90pts/100pts\)

  • 部分分

    • \(90pts\)

      • 设最后的可能的最短路中左右共移动了 \(d\) 次,上下共移动了 \(x\) 次。

      • 则等价于求 \(\min \{ x_{i}k+d_{i} \}=s\) 的解,观察到 \(d \in [0,\min(\left\lceil \frac{nm}{2} \right\rceil,s)]\)

      • 将左右移动次数也扔进 \(Dijkstra\) 中转移即可,然后暴力进行 \(check\) ,时间复杂度为 \(O(n^{4}\log n)\)

      • 因为需要 \(O(n^{4})\) 的辅助空间,所以需要开 short

        点击查看代码
        const double eps=1e-8;
        struct node
        {int nxt,to,x,d;
        }e[40010];
        int head[10010],cnt=0,n,m,limit;
        short dis[10010][5010];
        bitset<5010>vis[10010];
        char c[110][110];
        struct quality
        {short dis;int x,d;bool operator < (const quality &another) const{return dis>another.dis;}
        };
        void add(int u,int v,int x,int d)
        {cnt++;e[cnt].nxt=head[u];e[cnt].to=v;e[cnt].x=x;e[cnt].d=d;head[u]=cnt;
        }
        int work(int x,int y)
        {return (x-1)*m+y;
        }
        void dijkstra(int s)
        {memset(dis,0x3f,sizeof(dis));priority_queue<quality>q;dis[s][0]=0;q.push((quality){dis[s][0],s,0});while(q.empty()==0){int x=q.top().x,d=q.top().d;q.pop();if(vis[x][d]==0){vis[x][d]=1;for(int i=head[x];i!=0;i=e[i].nxt){if(d+e[i].d<=limit&&dis[e[i].to][d+e[i].d]>dis[x][d]+e[i].x){dis[e[i].to][d+e[i].d]=dis[x][d]+e[i].x;q.push((quality){dis[e[i].to][d+e[i].d],e[i].to,d+e[i].d});}}}}
        }
        int main()
        {
        #define Issac
        #ifdef Issacfreopen("msg.in","r",stdin);freopen("msg.out","w",stdout);
        #endifint sx,sy,tx,ty,t,i,j;double s,ans=0x7f7f7f7f,k,minn;scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);t=work(tx,ty);for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf(" %c",&c[i][j]);}}cin>>s;limit=min(ceil(n*m/2.0),ceil(s)-1);for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(c[i][j]=='0'){if(i-1>=0&&c[i-1][j]=='0'){add(work(i,j),work(i-1,j),1,0);}if(i+1<=n&&c[i+1][j]=='0'){add(work(i,j),work(i+1,j),1,0);}if(j-1>=0&&c[i][j-1]=='0'){add(work(i,j),work(i,j-1),0,1);}if(j+1<=m&&c[i][j+1]=='0'){add(work(i,j),work(i,j+1),0,1);}}}}dijkstra(work(sx,sy));if((int)s==s&&tx==sx&&abs(ty-sy)==(int)s){ans=0;}else{for(i=0;i<=limit;i++){if(dis[t][i]!=0x3f3f&&dis[t][i]!=0){k=1.0*(s-i)/dis[t][i];minn=0x7f7f7f7f;for(j=0;j<=limit;j++){if(minn-(1.0*j+1.0*k*dis[t][j])>eps){minn=1.0*j+1.0*k*dis[t][j];}}if(fabs(minn-s)<=eps&&ans-k>eps){ans=k;}}}}printf("%.3lf\n",ans);return 0;
        }
        
    • \(100pts\) :将上述做法的 \(dijsktra\) 改成 \(01BFS\) 即可,时间复杂度为 \(O(n^{4})\)

      点击查看代码
      const double eps=1e-8;
      struct node
      {int nxt,to,x,d;
      }e[40010];
      int head[10010],cnt=0,n,m,limit;
      short dis[10010][5010];
      bitset<5010>vis[10010];
      char c[110][110];
      void add(int u,int v,int x,int d)
      {cnt++;e[cnt].nxt=head[u];e[cnt].to=v;e[cnt].x=x;e[cnt].d=d;head[u]=cnt;
      }
      int work(int x,int y)
      {return (x-1)*m+y;
      }
      void bfs(int s)
      {memset(dis,0x3f,sizeof(dis));deque<pair<int,int> >q;dis[s][0]=0;q.push_back(make_pair(s,0));while(q.empty()==0){int x=q.front().first,d=q.front().second;q.pop_front();if(vis[x][d]==0){vis[x][d]=1;for(int i=head[x];i!=0;i=e[i].nxt){if(d+e[i].d<=limit&&dis[e[i].to][d+e[i].d]>dis[x][d]+e[i].x){dis[e[i].to][d+e[i].d]=dis[x][d]+e[i].x;if(e[i].x==1){q.push_back(make_pair(e[i].to,d+e[i].d));}	else{q.push_front(make_pair(e[i].to,d+e[i].d));}}}}}
      }
      int main()
      {
      #define Issac
      #ifdef Issacfreopen("msg.in","r",stdin);freopen("msg.out","w",stdout);
      #endifint sx,sy,tx,ty,t,i,j;double s,ans=0x7f7f7f7f,k,minn;scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);t=work(tx,ty);for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf(" %c",&c[i][j]);}}cin>>s;limit=min(ceil(n*m/2.0),ceil(s)-1);for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(c[i][j]=='0'){if(i-1>=0&&c[i-1][j]=='0'){add(work(i,j),work(i-1,j),1,0);}if(i+1<=n&&c[i+1][j]=='0'){add(work(i,j),work(i+1,j),1,0);}if(j-1>=0&&c[i][j-1]=='0'){add(work(i,j),work(i,j-1),0,1);}if(j+1<=m&&c[i][j+1]=='0'){add(work(i,j),work(i,j+1),0,1);}}}}bfs(work(sx,sy));if((int)s==s&&tx==sx&&abs(ty-sy)==(int)s){ans=0;}else{for(i=0;i<=limit;i++){if(dis[t][i]!=0x3f3f&&dis[t][i]!=0){k=1.0*(s-i)/dis[t][i];minn=0x7f7f7f7f;for(j=0;j<=limit;j++){if(minn-(1.0*j+1.0*k*dis[t][j])>eps){minn=1.0*j+1.0*k*dis[t][j];}}if(fabs(minn-s)<=eps&&ans-k>eps){ans=k;}}}}printf("%.3lf\n",ans);return 0;
      }
      
  • 正解

    • 观察到 \(\min \{ x_{i}k+d_{i} \}\) 具有单调性,即随着 \(k\) 的增大最短路长度不降。
    • 二分答案即可。
    点击查看代码
    const double eps=1e-8;
    double dis[110][110];
    bool vis[110][110];
    char c[110][110];
    void dijkstra(int sx,int sy,double mid,int n,int m)
    {for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){vis[i][j]=0;dis[i][j]=0x3f3f3f3f;}}priority_queue<pair<int,pair<int,int>>>q;dis[sx][sy]=0;q.push(make_pair(-dis[sx][sy],make_pair(sx,sy)));while(q.empty()==0){int x=q.top().second.first,y=q.top().second.second;q.pop();if(vis[x][y]==0){vis[x][y]=1;if(x-1>=1&&dis[x-1][y]>dis[x][y]+mid&&c[x-1][y]=='0'){dis[x-1][y]=dis[x][y]+mid;q.push(make_pair(-dis[x-1][y],make_pair(x-1,y)));}if(x+1<=n&&dis[x+1][y]>dis[x][y]+mid&&c[x+1][y]=='0'){dis[x+1][y]=dis[x][y]+mid;q.push(make_pair(-dis[x+1][y],make_pair(x+1,y)));}if(y-1>=1&&dis[x][y-1]>dis[x][y]+1&&c[x][y-1]=='0'){dis[x][y-1]=dis[x][y]+1;q.push(make_pair(-dis[x][y-1],make_pair(x,y-1)));}if(y+1<=m&&dis[x][y+1]>dis[x][y]+1&&c[x][y+1]=='0'){dis[x][y+1]=dis[x][y]+1;q.push(make_pair(-dis[x][y+1],make_pair(x,y+1)));}}}
    }
    int main()
    {
    #define Issac
    #ifdef Issacfreopen("msg.in","r",stdin);freopen("msg.out","w",stdout);
    #endifint n,m,sx,sy,tx,ty,i,j;double s,l=0,r,mid,ans=-1;cin>>n>>m>>sx>>sy>>tx>>ty;for(i=1;i<=n;i++){for(j=1;j<=m;j++){cin>>c[i][j];}}cin>>s;r=s;while(r-l>=eps){mid=(l+r)/2;dijkstra(sx,sy,mid,n,m);if(dis[tx][ty]>=s){ans=mid;r=mid;}else{l=mid;}}printf("%.3lf\n",ans);return 0;
    }
    

\(T2\) B. 共轭树图 \(0pts/0pts\)

  • 不妨钦定 \(u>v\) ,那么在断开 \((u,v)\) 这条边后等价于将 \(u\) 的深度最浅的祖先和 \(v\) 连接。故最终得到的 \(G\) 也一定是棵树,且当以 \(n\) 为根时也满足父亲节点的编号一定大于自身的编号。

  • 考虑这样的 \(G\) 是怎么构造出来的。当把 \(G\) 的边在原图上画出后,任意两条边之间只能不交和包含,因为如果相交的话下边的那条边的端点就可以连到上面的边上去。

  • 定义根节点的深度为 \(1\)

  • \(f_{x,i}\) 表示 \(x\)\(G\) 中只被允许与原图中它的 \(i \in [1,dep_{x}-1]\) 个祖先连边时(即 \(G\) 中的父亲节点)以 \(x\) 为根的子树中的方案数,状态转移方程为 \(f_{x,i}=\sum\limits_{j=2}^{i+1}\prod\limits_{y \in Son(x)}f_{y,j}\) ,边界为 \(f_{x,i}=i(i \in [1,dep_{x}-1] \land du_{x}=1)\)

  • 此时时间复杂度为 \(O(n^{3})\) ,考虑进一步优化。

  • 手摸展开后的式子,容易有 \(f_{x,i}=f_{x,i-1}+\prod\limits_{y \in Son(x)}f_{y,i+1}\) 。此时时间复杂度就优化成了 \(O(n^{2})\)

  • 最终,有 \(\prod\limits_{x \in Son(n)}f_{x,1}\) 即为所求。

    点击查看代码
    const ll p=998244353;
    int dep[3010],f[3010][3010];
    vector<int>e[3010];
    void add(int u,int v)
    {e[u].push_back(v);
    }
    void dfs(int x,int fa)
    {dep[x]=dep[fa]+1;for(int i=0;i<e[x].size();i++){dfs(e[x][i],x);}for(int k=1;k<=dep[x]-1;k++){f[x][k]=1;for(int i=0;i<e[x].size();i++){f[x][k]=1ll*f[x][k]*f[e[x][i]][k+1]%p;}f[x][k]=(f[x][k]+f[x][k-1])%p;}
    }
    int main()
    {
    #define Issac
    #ifdef Issacfreopen("reflection.in","r",stdin);freopen("reflection.out","w",stdout);
    #endifint n,u,v,ans=1,i;cin>>n;for(i=1;i<=n-1;i++){cin>>u>>v;if(u<v){swap(u,v);}add(u,v);}dfs(n,0);for(i=0;i<e[n].size();i++) {ans=1ll*ans*f[e[n][i]][1]%p;}cout<<ans<<endl;return 0;
    }
    

\(T3\) C. 摸鱼军训 \(0pts/0pts\)

  • 部分分
    • \(20 \%\)\(O(n^{2})\) 预处理 \(O(1)\) 查询。

\(T4\) D. 神奇园艺师 \(0pts/0pts\)

  • 部分分
    • 子任务 \(1\) :爆搜子集后就是货仓选址问题了,暴力分解质因数即可。

总结

  • \(T1\) 赛时觉得因为 \(k\) 的变化会导致最短路路径的变化然后就不能确定最短路长度了,没搞清其内部的单调性。
  • \(T2\) 始终没读懂题意。
  • \(T3\) 忘了可以 \(O(n^{2})\) 预处理,最低档部分分只写了单组询问 \(O(n^{2})\) 的做法,挂了 \(20pts\)
  • \(T4\) 质因数分解写的是预处理素数挨个分解的方法,导致无用素数极多,挂了 \(20pts\)

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

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

相关文章

[论文阅读] ZePo: Zero-Shot Portrait Stylization with Faster Sampling

写在前面 原文:ZePo GitHub:Github ZePo 关键词:肖像风格化、扩散模型、零样本快速生成 阅读理由:对扩散模型的改进,可以实现零样本快速生成图像,学习一下思路以及实验设计 前置知识:LCM以及GithubLCM(找时间写一下),可参考LCM&CM,一致性蒸馏、图像质量评价速览…

2024.11.12 鲜花

P11270 【MX-S5-T4】魔法少女们 题解这世界那么多人 这世界有那么多人 人群里 敞着一扇门 我迷朦的眼睛里长存 初见你蓝色清晨 这世界有那么多人 多幸运 我有个我们 这悠长命运中的晨昏 常让我 望远方出神 灰树叶飘转在池塘 看飞机轰的一声去远乡 光阴的长廊 脚步声叫嚷 灯一亮…

Java代码实现行列转换

本代码想要达到的效果 测试完整代码如下(copy直接运行): public class TestConvert { public static void main(String[] args) { ArrayList<Attribute> sourceList = new ArrayList<>(); for (int i = 0; i < 3; i++) { for (i…

SS241112A. 定向越野(walk)

这道题目要求找到从起点出发遍历所有点并回到起点的最小路径长度,路径必须直角拐弯。文章证明了答案是有理数,并通过直观分析和大胆猜测得出初始方向必须是某一个向量的方向,最终使用状压 DP 解决问题,时间复杂度为 $O(n^4 2^n)$。SS241112A. 定向越野(walk) 题意 给你 \…

第六课 Python之模块

一、模块的介绍 (1)python模块,是一个python文件,以一个.py文件,包含了python对象定义和pyhton语句 (2)python对象定义和python语句 (3)模块让你能够有逻辑地组织你的python代码段。 (4)把相关的代码分配到一个模块里能让你的代码更好用,更易懂 (5)模块能定义函数…

redis集群搭建 - cluster模式

搭建一套redis cluster集群。概述 搭建一套redis cluster集群。架构 192.168.0.21:6379 主 192.168.0.23:6380 从 192.168.0.22:6379 主 192.168.0.21:6380 从 192.168.0.23:6379 主 192.168.0.22:6380 从 修改这三台服务器的host文件(选做) vim /etc/hosts192.168.0.21 node…

推荐一个Elasticsearch ES可视化客户端工具:ES-King

ES-King:开源免费,一个现代、实用的ES GUI客户端,支持多平台。 下载地址:https://github.com/Bronya0/ES-King 功能清单 详尽的集群信息:节点信息、堆内存占用、总内存占用、cpu占用、磁盘占用、网络流量、节点角色、集群健康、5分钟负载、每个节点的字段缓存、段缓存、查…

Kafka怎么配置SASL用户名密码认证

服务端配置(server.properties):# 开启SASL认证 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN# 配置JAAS文件路径 listeners=SASL_PLAINTEXT://localhost:9092 sasl.enabled.mechanisms=PLAIN listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafk…

数据采集与融合技术第四次实践作业

gitee链接: https://gitee.com/zxbaixuexi/2024scrapy/tree/master/第四次实践 作业①: 1) 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。 候选网站:东方财富网: http://quote.eastmoney.com/cen…

项目冲刺11.12

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第四篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

快速修改kafka的broker配置或topic配置

下载开源的kafka界面客户端KafkaKing:https://github.com/Bronya0/Kafka-King 连接后,双击broker配置,或者双击topic配置:修改好后回车保存就行。有些配置是改不了的。