热身赛总结 题解

news/2025/11/12 14:44:49/文章来源:https://www.cnblogs.com/chenxuan11/p/19128778

1. 旅行计划

赛时思路

因为目标是:求出一直向东以城市 \(i\) 为终点最多能够游览多少个城市,我进行逆向思维,转换题意,将目标改成:以城市 \(i\) 为起点一直向西最多能够游览多少个城市,再看题目的数据范围:$n \le 10^5 $,因此便直接用 dfs 进行搜索,最后 TLE 了4个点 QwQ 。

改进思路

因为题目中说图中没有环,因此我们可以通过 DP 解决此题,所以我们就可以通过记忆化递归防止进行无效的 dfs 。

AC代码

点开有惊喜
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,x,y,dp[100005];
vector<ll>t[100005];
ll dfs(ll x,ll val){if(!t[x].size()) return val;ll mx=0;for(auto y:t[x]){if(!dp[y]) dp[y]=dfs(y,val);mx=max(mx,dp[y]);}return mx+1;
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){cin>>x>>y;t[y].push_back(x);}for(int i=1;i<=n;i++){ll mx=0;mx=dfs(i,1);cout<<mx<<"\n";}return 0;
}

2. 鬼子进村

赛时思路

本题有 3 个最本质的操作:单点修改和查询加区间查询,因此我考虑使用线段树解决此题。
单点修改和查询比较简单,只需遍历到叶子节点,修改或查询其信息,因此区间查询便十分重要,以至于此题没有做出来 QwQ 。

改进思路

略微借鉴本题题解便会发现,我们只需找出此节点右边第一个"被摧毁房子"的位置 \(r\) 和左边第一个"被摧毁房子"的位置 \(l\) ,而士兵可移动的距离则是 \(r-l+1\)
那如何判断此区间是否存在 \(l\)\(r\) ,我们只需要统计区间长度 \(len\) 以及区间未被摧毁房子的个数 \(sum\) , 看 \(sum\) 是否比 \(len\) 小,如果是,则此区间存在 \(l\)\(r\) 的位置;相应的,如果都没有被摧毁的房子则返回 -1( \(l\) )或 $n+$1( \(r\) )。

注意

  • 在寻找 \(l\)\(r\) 之前,要先判断这个"房子"是否"被摧毁",否则答案会出错;
  • 在进行修改之前,需要进行建树,统计每个节点的 \(len\) , 并将所有 \(sum\) 赋值为 1 ,方便后面进行修改以及查询;

AC代码

点开有惊喜

#include<bits/stdc++.h>
#define ll long long
#define lc x*2
#define rc x*2+1
using namespace std;
const ll N=1e5+5;
struct node{ll sum,len;
}t[4*N];
ll n,m,x,zh[N],cnt;
char ch;
void build(ll x,ll l,ll r){t[x].len=r-l+1;if(l==r){t[x].sum=1;return;}ll mid=(l+r)/2;build(lc,l,mid);build(rc,mid+1,r);t[x].sum=t[lc].sum+t[rc].sum;
}
void cxa(ll x,ll l,ll r,ll mb,ll k){if(l==r){t[x].len=1;t[x].sum=(k?0:1);return;}ll mid=(l+r)/2;if(mb<=mid)cxa(lc,l,mid,mb,k);else cxa(rc,mid+1,r,mb,k);t[x].len=t[lc].len+t[rc].len;t[x].sum=t[lc].sum+t[rc].sum;
}
ll check(ll x,ll l,ll r,ll pos){if(l==r)return t[x].sum;ll mid=(l+r)/2;if(pos<=mid)return check(lc,l,mid,pos);else return check(rc,mid+1,r,pos);
}
ll fidle(ll x,ll l,ll r,ll qr){if(r<1||l>qr) return -1;if(t[x].sum==t[x].len) return -1;if(l==r) return l;ll mid=(l+r)/2;ll res=fidle(rc,mid+1,r,qr);if(res!=-1) return res;return fidle(lc,l,mid,qr);
}
ll fidrt(ll x,ll l,ll r,ll ql){if(l>n||r<ql) return-1;if(t[x].sum==t[x].len) return-1;if(l==r) return l;ll mid=(l+r)/2;ll res=fidrt(lc,l,mid,ql);if(res!=-1) return res;return fidrt(rc,mid+1,r,ql);
}
int main(){cin>>n>>m;build(1,1,n);while(m--){cin>>ch;if(ch=='D'){cin>>x;zh[++cnt]=x;cxa(1,1,n,x,1);}else if(ch=='Q'){cin>>x;if(!check(1,1,n,x)){cout<<"0\n";continue;}ll le=fidle(1,1,n,x-1);if(le==-1) le=0;ll rt=fidrt(1,1,n,x+1);if(rt==-1) rt=n+1;cout<<rt-le-1<<"\n";}elsecxa(1,1,n,zh[cnt--],0);}return 0;
}

3. Radio Transmission 无线传输

赛时思路

题目中字符串 \(s_1\) 是由某个子串 \(s_2\) 重复至少 2 次形成的。我们需要找到 \(s_2\) 的最短长度,本质是寻找 \(s_1\) 中能构成其重复结构的最小单元长度。因此我便认为此题所用到的算法应包括 KMP ,可惜后来没时间继续想了 QwQ 。

改进思路

问题的本质确实已经被我想到了,可还有几点不全;
在 KMP 中,我们常定义 nex[x] 表示最长前缀及后缀的子串长度

答案推导

若字符串 \(t\) 是由子串 \(s\) 重复 \(k\) 次构成( \(k\ge 2\) ),则:

  • 总长度 \(len = k \times len(s)\)
  • \(nex[len]\) 本质是 \(s\) 重复 \(k-1\)次的长度,即 \(nex[len] = (k-1) \times len(s)\)
  • 两式相减得:\(len - nex[len] = len(s)\) ,即最短重复子串 \(s\) 的长度。

AC代码

点开有惊喜
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+5;
char t[N]; 
ll nex[N],len;
int main(){cin>>len>>t+1;nex[1]=0;for(int i=2,j=0;i<=len;i++){while(j&&t[j+1]!=t[i]) j=nex[j];if(t[j+1]==t[i]) j++;nex[i]=j;}cout<<len-nex[len];return 0;
}

4.木棍分割

前言

没有赛时思路,考场上甚至没有来得及看此题 QwQ 。

思路

本题主要由两个问题组成:最长段的最小长度和组成此长度的方案数量,而且前者答案还为后者的限定条件的这么一个问题,当我们找到问题的根本后,就要去思考解决此类问题的算法有哪些,因此我们确定了此题我们的算法:二分加 DP ("最长的最短"肯定可以直接想到二分,而"方案数量则一般用 DP 解决")。

问题一:二分

因为最长的最短长度具有单调性(当长度 \(x\) 可以,则 \(x+1\) ~ \(\infty\)之间的答案也都能成立),所以我们可以二分长度,而 check 函数也比较简单,能不分割就不分割,看最后分割次数是否大于 \(m\) 即可。
!注意

  • \(l\)的初始值为 a[i] 的最大值,而 \(r\) 的值则为 \(\sum\) a[i],这样可以防止一些没用的判断,降低点时间复杂度(毕竟这题卡常)。
  • 时间复杂度:\(O(n\ log\ S)\),其中S是所有木棍的总长度

问题二:DP

状态申明

  • \(dp[i]\):前i根木棍分割成若干段,每段长度不超过 ans 的方案数

状态转移方程

  • \(dp[i] = sum( dp[j] )\),其中j满足 \(a[j+1] + a[j+2] +...+ a[i]\) \(\le ans\)
  • 即所有满足最后一段长度不超过ans的j的位置

前缀和优化

  • 计算前缀和数组 \(s\) ,其中 \(s[i] = dp[0] + dp[1] +...+ dp[i]\)
  • \(dp[i] = s[i-1] - s[left-1]\),其中 \(left\) 是满足 $sum[j+1 ~ i] \le ans $ 的最小 \(j\)

滑动窗口确定 \(left\)

  • 使用双指针维护 \(left\) 的位置,避免重复计算

遍历顺序

  • 外层循环:遍历段数 \(j\) ,从 \(1\)\(m+1\)(需要计算不同段数下的方案数,并累加得到总方案数)
  • 内层循环:遍历前 \(i\) 根木棍,从 \(1\)\(n\)(按顺序计算每个状态 \(dp[i]\) ,确保在计算 \(dp[i]\) 时,所有依赖的状态\(dp[j]\) 已经计算完成)

边界条件

  • \(s[0]=1\),表示空分割方案数为 \(1\)
  • \(i=0\) 时,\(dp[0]=1\) ,表示前 \(0\) 根木棍的分割方案数为 \(1\)

最终答案
\(dan=\sum_{j=1}^{m+1}dp[n]\)
\(dan\mod 10^4+7\)

AC代码

点开有惊喜
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll Mod=1e4+7;
ll n,m,a[50005],l,r,ans;
ll dp[50005],s[50005],lef[50005],nw,dan;
bool check(ll x){ll cnt=1,len=0;for(int i=1;i<=n;i++){if(len+a[i]>x)cnt++,len=a[i];else len+=a[i];if(cnt>m+1)return 0;}return 1;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];l=max(l,a[i]);r+=a[i];}while(l<=r){ll mid=(l+r)/2;if(check(mid))ans=mid,r=mid-1;else l=mid+1;}cout<<ans<<" ";for(int i=1;i<=n;i++)a[i]+=a[i-1];for(int i=1;i<=n;i++){while(a[i]-a[nw]>ans) nw++;lef[i]=nw;}for(int i=0;i<=n;i++)s[i]=1;for(int j=1;j<=m+1;j++){for(int i=1;i<=n;i++)dp[i]=(s[i-1]-s[lef[i]-1]+Mod)%Mod;s[0]=0;for(int i=1;i<=n;i++)s[i]=(s[i-1]+dp[i])%Mod;dan=(dan+dp[n])%Mod;}cout<<dan;return 0;
}

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

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

相关文章

2025年气流流型检测仪品牌推荐与选择制造企业权威推荐榜单:灌装机气流流型检测仪/气流流型验证服务/烟雾发生器源头厂家精选

在制药、生物工程和电子行业对洁净环境要求日益严格的今天,一台可靠的气流流型检测仪已成为保障洁净室性能的关键装备。 本文将基于技术实力、生产能力、产品质量、市场表现及服务体系等多维度核心指标,为您呈现2025…

告别重复“点点点”!基于Dify工作流,打造能思考、会决策的自主测试智能体

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 在敏捷开发与DevOps的洪流下,传统的手工“点点点”测试已成为交付链条上最沉重的枷锁。即便引入了自动化脚本,其脆弱的、预设路径的测试模…

matplotlib 保存pdf图时,TrueType font is missing table.

============================= matplotlib 保存pdf 图时,TrueType font is missing table.E:\Eprogramfiles\Anaconda3\lib\site-packages\matplotlib\backends\_backend_pdf_ps.py:102: RuntimeWarning: Glyph 8722…

开盖扫码领红包小程序系统:实体商家的营销增长利器

一、概述总结 开盖扫码领红包小程序系统是一款适配微信公众号的线下实体商品推广工具,通过微擎系统交付,提供未加密源码支持二次开发。商家可生成固定二维码或 “一物一码”,搭配防伪安全验证码印刷在商品包装或瓶盖…

Vue---开发数字大屏大屏

最近做项目,需要给客户做个高端大气的数字屏,展示各种数据。 具体参考:https://cloud.tencent.com/developer/article/2409796大屏数据可视化解决方案:DataVDataV 是一款基于 Vue 开发的数据可视化组件库,主要用于…

es 如果主分片坏了,一个副本分片是最新的和主分片一样怎么操作变为主分片怎么操作

在 Elasticsearch(ES)中,如果主分片损坏,但某个副本分片的数据是最新的,集群会自动将该副本提升为新的主分片,无需人工干预。这是 ES 内置的高可用机制的一部分。 自动提升流程如下:节点故障检测集群检测到主分…

1JDBC简介

1、以上仅供参考,如有疑问,留言联系

el-table展开行内容增加后没有出现滚动条

增加以下代码: this.$nextTick(() => { this.$refs.pageTable.doLayout(); }) 实现表格重新布局

海报积分商城小程序:高效吸粉与礼品兑换的全能解决方案

一、概述总结 海报积分商城是一款基于微擎系统开发的多功能营销工具,支持微信公众号(含订阅号借权服务号使用)场景,核心通过二维码海报邀请好友赚取邀请币兑换礼品的模式,实现高效吸粉与用户留存。系统经商用验证…

智能体同工作流的关系和区别

智能体同工作流的关系和区别理解智能体(Agent)和工作流(Workflow)的区别,可以从定义、核心能力、应用场景、自主性等维度展开分析:智能体(Agent) 工作流(Workflow)定义 具备感知、决策、行动能力的智能实体,…

出入门禁管理应用:智能高效的出入口管控解决方案

一、概述总结 微擎出入门禁管理应用是一款专为微信公众号开发的智能管控工具,以 “表单申请 + 二维码核销” 为核心流程,实现对人员出入的全流程数字化管理。应用支持多级别审核、自定义配置、实时数据监控与数据导出…

习题解析之:正负交错数列前n项和

习题解析之:正负交错数列前n项和【问题描述】求 1-1/2+2/3-3/5+4/8-5/13+...的前n项和,n由用户输入(n>0),结果用str.format()方法保留小数点后6位数字输出。 输入格式一个正整数 输出格式前n项的和 示例输入:…

vmware+centos7虚拟机连接不到网络的问题

转载自:https://blog.csdn.net/fuxiangnan6/article/details/100026372 vmware+centos7虚拟机连接不到网络的问题 1.首先介绍我遇到的情况: 我用VMware Workstation 15 Pro + centos7 搭建了一台虚拟机,开始是没问题…

对象转字典列表字典转对象

import os class Student:stu_list = []def __init__(self, name, age, phone):self.name = nameself.age = ageself.phone = phonedef __str__(self):return f{self.name}, {self.age}, {self.phone}if __name__ == _…

高效赋能 B2B 贸易:区域化智能订货配送系统全方位解析

一、概述总结 该系统是一款专为 B2B 场景打造的智能订货配送解决方案,支持微信公众号部署,以微擎系统为交付载体,核心聚焦区域化定价、会员分级优惠、全流程订单管理等核心需求。系统提供源码交付服务,杜绝线下交易…

详细介绍:【Kylin V10】Ambari3.0.0 安装 Unexpected error Ambari repo file path not set for current OS 报错解决

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python异步协程

async/await 和 asyncio Python 引入了 async/await 语法来支持异步编程。当我们在函数定义前加上 async 关键字时,这个函数就变成了一个"协程"(coroutine)。而 await 关键字则用于等待一个协程完成。 im…

设计QQ,网络协议如何设计

以上仅供参考,如有疑问,留言联系

LuatOS MCU新手指南:核心功能测试与代码示例速递

MCU开发初学者看过来!本文聚焦LuatOS的MCU核心库,深入演示时钟频率获取、唯一ID读取、高精度计时、IO复用配置等核心功能测试方法,并配以实用代码示例,助力开发者迅速掌握芯片级开发技巧,快速踏上开发之路。 一、…

避开 Playwright 常见坑,让你的 UI 测试跑得又快又稳

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集本文适合正在使用或准备使用 Playwright 做自动化测试的朋友,帮助你避开踩坑,提高测试效率。 近年来,Playwright 作为一款跨浏览器、跨平…