CEXE的%你赛5-题解

news/2025/9/29 17:05:15/文章来源:https://www.cnblogs.com/CrossBow-EXE/p/19119119

T1

简单 dfs,记录数组 \(vis\) 表示一个点有没有被搜索过,从小到大遍历 \(vis\),如果 \(vis_i=0\) 则从 \(i\) 开始遍历图,遍历时记录答案即可。

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[30005];
vector<int> G[30005];
bool vis[30005];
long long ans=0,maxn=-1;
void dfs(int x){vis[x]=1;maxn=max(maxn,a[x]);for(auto to:G[x]){if(vis[to]) continue;dfs(to);}
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1,u,v;i<=m;i++){cin>>u>>v;G[u].push_back(v);}for(int i=1;i<=n;i++){if(!vis[i]){maxn=-1;dfs(i);ans+=maxn;}}
//	cout<<"13"<<endl;cout<<ans<<endl;return 0;
}

T2

数学题,答案为 \(\left \lfloor \frac{n+1}{2} \right \rfloor\)。记得开 unsigned long long

void Main(int cases){ull x;cin>>x;cout<<(x+1>>1)<<endl;return;
}

T3

数据结构板子题。可以用树状数组、线段树、分块。这里讲最简单的分块做法。

把序列分成 \(\sqrt n\) 个长度均匀的块。对于每个位置,记录 \(id_i\),表示 \(i\) 这个位置属于哪个块。

对于每个块记录几个属性:

  • \(sum\),表示这个块的和
  • \(add\),懒标记
  • \(cnt\),这个块内包含了多少元素(接近 \(\sqrt n\)

两种操作如下:

  • 对于区间加,把范围内的整块的懒标记增加,整块两边的碎块暴力增加
  • 对于查询,整块的和为 \(sum+add\times cnt\),碎块直接暴力统计

总体复杂度 \(O(n \sqrt n)\)

分块写法:

ll n,m,len;
ll a[100005],id[100005],sum[100005],add[100005],cnt[100005];
ll op,x,y,k;
void op1(int l,int r,int x){if(id[l]==id[r]){for(int i=l;i<=r;i++){a[i]+=x;sum[id[i]]+=x;}}else{for(int i=l;id[i]==id[l];i++){a[i]+=x;sum[id[i]]+=x;}for(int i=r;id[i]==id[r];i--){a[i]+=x;sum[id[i]]+=x;}for(int i=id[l]+1;i<=id[r]-1;i++){add[i]+=x;}}
}
ll op2(int l,int r){ll ans=0;if(id[l]==id[r]){for(int i=l;i<=r;i++){ans+=a[i]+add[id[i]];}return ans;}else{for(int i=l;id[i]==id[l];i++){ans+=a[i]+add[id[i]];}for(int i=r;id[i]==id[r];i--){ans+=a[i]+add[id[i]];}for(int i=id[l]+1;i<=id[r]-1;i++){ans+=sum[i]+add[i]*cnt[i];}return ans;}
}
void Main(int cases){cin>>n;len=sqrt(n);for(int i=1;i<=n;i++){cin>>a[i];id[i]=i/len;//i属于第几个块 sum[i/len]+=a[i];//第i个块的和 cnt[i/len]++;//第i个块有多少个数 }cin>>m;while(m--){cin>>op;if(op==1){cin>>x>>y>>k;op1(x,y,k);}if(op==2){cin>>x>>y;cout<<op2(x,y)<<endl;}}return;
}

线段树写法:

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define int long long
using namespace std;
const int N=100005;
int a[N];
int n,m,op,x,y,k;
struct node{int l,r,sum,lazy;
}tr[N<<2];
void pushup(int u){tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int u){if(tr[u].lazy){//有懒标记才pushdown tr[u<<1].sum+=(tr[u<<1].r-tr[u<<1].l+1)*tr[u].lazy;//区间和增加(区间元素个数)个懒标记 tr[u<<1|1].sum+=(tr[u<<1|1].r-tr[u<<1|1].l+1)*tr[u].lazy;tr[u<<1].lazy+=tr[u].lazy;//把懒标记传递给左右孩子 tr[u<<1|1].lazy+=tr[u].lazy;tr[u].lazy=0;//清空懒标记 }
}
void build(int u,int l,int r){tr[u].l=l,tr[u].r=r;if(l==r){tr[u].sum=a[l];tr[u].lazy=0;//懒标记初始化 return;}int mid=(l+r)>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);
}
void modify(int u,int l,int r,int val){if(tr[u].l>=l&&tr[u].r<=r){tr[u].sum+=val*(tr[u].r-tr[u].l+1);//需要加很多个val tr[u].lazy+=val;//懒标记一下,标记加上过valreturn; }pushdown(u);//懒标记下传int mid=(tr[u].l+tr[u].r)>>1;if(mid>=l) modify(u<<1,l,r,val);if(mid<r) modify(u<<1|1,l,r,val);pushup(u); 
}
int ask(int u,int l,int r){if(tr[u].l>=l&&tr[u].r<=r){return tr[u].sum;}pushdown(u);int mid=(tr[u].l+tr[u].r)>>1,sum=0;if(mid>=l) sum+=ask(u<<1,l,r);if(mid<r) sum+=ask(u<<1|1,l,r);return sum;
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}cin>>m;build(1,1,n);
//	cout << tr[1].sum<<endl;while(m--){cin>>op;if(op==1){cin>>x>>y>>k;modify(1,x,y,k);}else{cin>>x>>y;cout<<ask(1,x,y)<<endl;}} return 0;
}

T4

诈骗题。

注意到结尾的动图小标题为“小彩蛋”,而其他题目都为“小踩蛋”,显然答案与这个动图有关。

不难猜到题中所说的游戏是荒野乱斗(BrawlStars),查找荒野乱斗中的所有人物,可以发现动图中人物名为阿尔提,英文名为 R-T。小写的 rt 在锣鼓中恰好为“如题”的意思,所以答案为 rt

下次模拟赛还有类似这样的题目!

T5

可爱动态规划。

第一问很好求,状态转移方程为 \(dp_i=\max\{dp_j\}+1\)

第二问,根据 Dilworth 定理,最小链覆盖等于最长反链长度(模拟即可理解),故答案与第一问答案完全相同。输出两次即可。

不知道 Dilworth 定理的去看 P1020 导弹拦截。

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int n,a[5005],dp[5005],ans=-1e9;
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){for(int j=0;j<i;j++){if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);}}for(int i=1;i<=n;i++) ans=max(dp[i],ans);cout<<ans<<' '<<ans<<endl;return 0;
}

T6

可爱动态规划。

第一问简单 dp,定义 \(dp_{i,j}\) 表示从起点到 \((i,j)\) 的最大得分,显然有 \(dp_{i,j}=\max(dp_{i-1,j},dp_{i,j-1})\)

第二问需要在第一问转移时进行。定义 \(sum_{i,j}\) 表示从起点走到 \((i,j)\) 能得到最大价值的方案数,转移方程为:

  • 如果 \(dp_{i-1,j}>dp_{i,j-1}\),则 \(sum_{i,j}=sum_{i-1,j}\)
  • 如果 \(dp_{i-1,j}<dp_{i,j-1}\),则 \(sum_{i,j}=sum_{i,j-1}\)
  • 如果 \(dp_{i-1,j}=dp_{i,j-1}\),则 \(sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}\)

别忘了取模。

第三问直接再次 dp,从 \((x,y)\) 点开始递推直到 \((n,m)\) 即可。

int n,m,x,y;
ll a[N][N];
ll dp1[N][N],dp2[N][N];
ll sum[N][N];void Main(int cases){n=read(),m=read(),x=read(),y=read();up(i,1,n){up(j,1,m){a[i][j]=read();}}sum[1][1]=1;up(i,1,n) dp1[i][1]=dp1[i-1][1]+a[i][1],sum[i][1]=1;up(j,1,m) dp1[1][j]=dp1[1][j-1]+a[1][j],sum[1][j]=1;up(i,2,n){up(j,2,m){if(dp1[i-1][j]>dp1[i][j-1]) dp1[i][j]=dp1[i-1][j]+a[i][j],sum[i][j]=sum[i-1][j]%1000000000;if(dp1[i-1][j]<dp1[i][j-1]) dp1[i][j]=dp1[i][j-1]+a[i][j],sum[i][j]=sum[i][j-1]%1000000000;if(dp1[i-1][j]==dp1[i][j-1]) dp1[i][j]=dp1[i][j-1]+a[i][j],sum[i][j]=(sum[i][j-1]+sum[i-1][j])%1000000000;}}
//	up(i,1,n){
//		up(j,1,m){
//			cout<<sum[i][j]<<' ';
//		}cout<<endl;
//	}cout<<dp1[n][m]<<' '<<sum[n][m]<<' ';up(i,x,n) dp2[i][y]=dp2[i-1][y]+a[i][y];up(j,y,m) dp2[x][j]=dp2[x][j-1]+a[x][j];up(i,x+1,n){up(j,y+1,m){if(i==x&&y==j) continue;dp2[i][j]=max(dp2[i-1][j],dp2[i][j-1])+a[i][j];}}cout<<dp1[x][y]+dp2[n][m]-a[x][y]<<endl;return;
}

T7

双指针。为了快速求出区间和,先预处理前缀和。

维护两个指针 \(p_1,p_2\),从一开始往后扫。

注意到正整数序列,所以对于一个区间 \([l,r]\) 的和 \(sum_{l,r}\),一定有 \(sum_{l+1,r} < sum_{l,r} < sum_{l,r+1}\)。即区间和是递增的。

接着,我们会发现,对于一个给定的区间右端点 \(r\),满足条件的左端点 \(l\) 的取值一定是连续的。我们只需要找出这个连续区间的长度,那么这个 \(r\) 对答案的贡献就是这个区间的长度。

所以,我们用开头提到的两个指针从 \(1\) 开始,枚举区间右端点 \(right\),对于每个右端点分别找到第一个满足和小于等于 \(r\) 的地方 \(p_1\),以及第一个满足和小于 \(l\) 的地方 \(p_2\),则这个右端点对答案的贡献为 \(\max\{0,p_1-p_2\}\)

答案很大,记得开 long long

int a[3000005],sum[3000005];
int p1=1,p2=1;
ll ans=0;
void Main(int cases){n=read(),l=read(),r=read();up(i,1,n){a[i]=read();sum[i]=sum[i-1]+a[i];}up(right,1,n){int p=sum[right];while(p1<=right&&p-sum[p1-1]>r) p1++;while(p2<=right&&p-sum[p2-1]>=l) p2++;ans+=max(0,p2-p1);}cout<<ans<<endl;return;
}

关注 CEXE!

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

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

相关文章

C++语言(1)

.数制的前缀 二进制:0b或0B。 八进制:0。注意代码中012的十进制数值是10。 十六进制:0x(字母小写)或0X(字母小写)。 .输入和输出 .1.scanf和printf 格式符 常见类型的格式符:类型 格式符int %dlong long %llds…

Windows多人共享文件夹全流程,附2025新共享文件快90%

针对传统Windows共享文件夹设置繁琐、不安全、仅限局域网的痛点,本文提出用坚果云创建多人共享文件夹。其操作简便,支持跨地域协作、精细权限管理与文件版本回溯,无缝替代传统方式,是实现团队安全、高效协同办公的…

第11章 day11-day12关于json请求体/逆向爬虫实战

第1知识点:关于json请求体 第2知识点:关于精准请求(如何排除干扰请求) 第3知识点:入口定位 一、关键字方法 (1) 方法关键字 encrypt decrypt (2) key关键字 第4知识点:断点与断点调试 普通断点 XHR断点 条件断点…

容斥与二项式反演

先挖坑,后填坑。容斥 容斥,实际上就是用总的方案数减去不合法的方案数。 我们考虑以下组合恒等式: \[\sum_{i = 0}^{n} (-1) ^ {i} C_{n}^{i} = [n = 0] \]为什么这个式子跟容斥有关呢? 我们考虑不合法的数量为 \(…

网上怎样做电缆网站建设网站公司怎么建站

centos7 mysql 基本测试&#xff08;7&#xff09;主从并行简单测试 重启MySQL服务使配置生效。 注意&#xff1a;并行复制需要slave的硬件资源充足&#xff0c;并且确保网络通信和IO性能不是瓶颈。不是所有的应用场景都适合并行复制&#xff0c;比如写密集型应用或者slave负…

react useCallback Hook详解

什么是 useCallback Hook? useCallback 是一个 React Hook,用于缓存函数,防止函数在每次组件渲染时被重新创建。它的主要目的是优化性能,特别是在将函数作为 props 传递给子组件或在依赖数组中使用时。 简单来说,…

从Docker构建失败到CRA被淘汰:一个React项目的ES模块探索记录

开头 最近给一个React项目配Docker构建,碰到了一个看起来简单实际很麻烦的错误: Failed to compile. The target environment doesnt support dynamic import() syntax so its not possible to use external type mo…

充气泵PCBA方案中数字传感器和模拟传感器的差异

充气泵的核心需求是实时、准确检测气罐/充气对象(如轮胎、泳圈)的压力,并根据压力值控制电机启停(如达到目标压力后停机),二者的应用差异直接影响产品体验:1.模拟传感器的应用场景低成本入门级充气泵(如家用小…

实用指南:小米17手机的上市公司供应商

实用指南:小米17手机的上市公司供应商pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

小程序支付遇到:system:access_denied

小程序支付遇到:system:access_denied 原因: 小程序支付,只能用手机微信测试,不能用电脑。 -

cloudfared 内网穿透经过docker方式遇到的问题

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

CDN + WAF + CLB + Higress 架构下的 TLS 加解密详细解析(适用阿里云)

在云环境中,Web 应用常见架构是:用户 → CDN → WAF → CLB → ECS/Higress本文详细解析 WAF 在网络拓扑中的位置、TLS 加解密流程、回源逻辑,以及自定义接入模式下的注意事项,结合阿里云官方推荐实践。1.WAF 在网…

react useMemo Hook详解

什么是 useMemo Hook? useMemo 是一个 React Hook,用于缓存计算结果,避免在每次组件渲染时重复执行昂贵的计算。它通过记忆计算的值,只有在依赖项变化时才会重新计算,从而优化性能。 简单来说,useMemo 让你的计算…

门户网站改版建议wordpress 调用热门 文章

文章目录 1.liunx简介2.liunx的jdk安装2.liunx的tomcat安装3.liunx的mysql安装4.单机项目部署 1.liunx简介 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff09;&#xff0c;是一种免费…

vs2012网站开发济南做网站的网络公司

简介&#xff1a; 淘宝的开放技术目前主要有两种形态&#xff0c;第一种是小程序&#xff0c;第二种是今天的主角小部件。它是基于小程序技术体系&#xff0c;面向标准化、轻量化、高性能的开放卡片场景。本文我们将通过技术设计策略、核心技术设施、业务场景接入、技术演进路线…

网站后台系统有哪些佛山优化企业网站排名平台

实验要求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址。 2、&#xff08;1&#xff09;R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方。 &#xff08;2&#xff09;R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方。 &#…

完整教程:Python 编辑器:Visual Studio Code(进阶篇)

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

Python技能大赛-备赛建议

好的,非常理解您希望得到具体、可行的备赛建议。基于您提供的比赛文件,特别是关于“专业能力模块”的详细要求,我为您梳理了一套系统的备赛策略。 [cite_start]该模块分为 理论知识 (权重10%) 和 实践操作 (权重60%…

公司建设网站产生哪些费用毕设做网站些什么比较简单

一、前言 内部培训会有Word版本题库&#xff0c;考核时如果使用Word、Excel、PDF等文档进行关键字查询题目体验不佳。so&#xff0c;撸个软件吧&#xff01;   20240728更新&#xff1a;支持更多题库类型。 二、Word题库转Excel 1、Word题库格式要求 内容格式要求事例题目…

怎样提高网站收录上海建设厅网站

文章目录 下载树莓派镜像下载烧写软件烧写编辑设置连接树莓派4B重启ssh查看树莓派IPssh远程连接问询、帮助 下载树莓派镜像 https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit 下载烧写软件 https://www.raspberrypi.com/software/ 烧写 编辑…