【vjudge训练记录】大一寒假专项训练——前缀和/差分

news/2025/1/22 18:13:07/文章来源:https://www.cnblogs.com/longxingx/p/18686361

训练情况

A题

前缀和模板题,我们输入完 \(a_i\) 后直接求前缀和 \(a_i = a_i + a_{i-1}\),求区间 \([l,r]\) 的和就为 \(a_r-a_{l-1}\)

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,m;cin>>n>>m;vector<int> a(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 2;i<=n;i++) a[i] += a[i-1];while(m--){int l,r; cin>>l>>r;cout<<a[r] - a[l-1]<<endl;}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

B题

差分模板题,我们记 \(p_i = a_i - a_{i-1}\),区间加只需要在 \(p_l += k,p_{r+1} -= k\),最后再求一遍前缀和即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,m; cin>>n>>m;vector<int> a(n + 1),p(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 1;i<=n;i++) p[i] = a[i] - a[i-1];while(m--){int l,r,k; cin>>l>>r>>k;p[l]+=k;p[r+1]-=k;}  for(int i = 1;i<=n;i++) p[i] += p[i-1];for(int i = 1;i<=n;i++) cout<<p[i]<<" ";
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

C题

\(n\) 个数里头尾删掉 \(k\) 个数,可以等价为连续选 \(n-k\) 个连续的数求和,区间求和问题我们可以使用前缀和预处理

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,k; cin>>n>>k;vector<int> a(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 1;i<=n;i++) a[i] += a[i-1];int ans = 0;for(int i = 1;i+n-k-1<=n;i++) ans = max(ans,a[i+n-k-1] - a[i-1]);cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

D题

二维差分再前缀和,输入矩阵的左上角 \((xa,ya)\) 右下角 \((xb,yb)\),其中我们差分数组 \((xa,ya)\) 加一,即从 \((xa,ya)\)\((n,n)\) 的地毯数全部加一,所以我们差分数组 \((xb+1,yb+1)\) 减一,即从 \((xb+1,yb+1)\)\((n,n)\) 的地毯数全部减一,剩下了两个区域 \((xb+1,ya),(xa,yb+1)\) 再减一,最后再求一遍二维前缀和查询即可

image

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n,m; cin>>n>>m;vector<vector<int>> a(n + 2,vector<int>(n + 2));while(m--){int xa,ya,xb,yb; cin>>xa>>ya>>xb>>yb;++a[xa][ya];++a[xb+1][yb+1];--a[xb+1][ya];--a[xa][yb+1];}for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){a[i][j] += a[i][j-1];}}for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){a[i][j] += a[i-1][j];}}for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){cout<<a[i][j]<<" ";}cout<<endl;}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

E题

选取当前卡牌到最左边实际上就是区间 \([1,r]\) 求和,直接前缀和处理,想要答案最大,前缀和贡献只能为正,至少选择两张,所以要从二开始

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;vector<int> a(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 1;i<=n;i++) a[i] += a[i-1];int ans = 0;for(int i = 2;i<=n;i++) if(a[i] > 0) ans += a[i];cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

F题

等差数列差分一次还是有公差 d 的存在,所以我们再差分一次就可以做到 \(O(1)\) 更新了,差分后的结果如上图,最后跑两边前缀和就是答案

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,m; cin>>n>>m;vector<int> a(n + 5);while(m--){int l,r,s,e; cin>>l>>r>>s>>e;int res = (e - s) / (r - l);a[l] += s;a[l+1]+=(res-s);a[r+1] -= (res + e);a[r+2] += e;}for(int i = 1;i<=n;i++) a[i] += a[i-1];for(int i = 1;i<=n;i++) a[i] += a[i-1];int ans = 0,ma = 0;;for(int i = 1;i<=n;i++) ans ^= a[i],ma = max(ma,a[i]);cout<<ans<<" "<<ma<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

G题

直接枚举区间 \([l,r]\) 的时间复杂度为 \(O(n^2)\) 会超时,对于区间求和的问题我们容易想到前缀和,但是我们需要处理区间是 \(k\) 的倍数,我们考虑对前缀和对 \(k\) 取模(取余数),如果位置 \(l,r\) 的前缀和 \((p_l \mod k) = (p_r \mod k)\) 则说明区间 \([l,r]\) 的和一定是 \(k\) 的倍数,因为 \((x \mod b) = ((x + kb) \mod b)\),所以我们需要统计 \(p_i\) 余数的出现次数,遍历的时候查询当前位置余数在前面出现了几次,就是有几个区间,答案加上区间个数即可,注意一下初始条件,详情见代码

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,k; cin>>n>>k;int a[n+1],pre[n+1],cnt[n+1];pre[0] = 0;for(int i = 1;i<=n;i++) cin>>a[i],cnt[i] = 0;for(int i = 1;i<=n;i++) pre[i] = pre[i-1] + a[i];for(int i = 1;i<=n;i++) pre[i] %= k;cnt[0] = 1;int ans = 0;for(int i = 1;i<=n;i++){ans += cnt[pre[i]];cnt[pre[i]]++;}cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

H题

https://www.luogu.com.cn/article/0kz22o0v

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

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

相关文章

VSCode使用之go语言配置

时间:2025/1/22 扩展:go 目的:支持go语言,方便安装其他必备插件安装该扩展包后可以执行该扩展包提供的命令Go:Install/Update Tools来进一步扩展go工具执行命令的窗口可以通过Ctrol+Shift+P调出点击后会出现很多选项,可以根据自己需要勾选然后点击确定,等待下载安装,一般情…

VSCode设置之默认在当前文件目录下打开终端

在vscode界面依次点击“文件”→“首选项”→“设置”→“用户”→“功能”→“终端”,找到Integrated:Cwd选项,将其值修改为”${fileDirname}“,即可在所有打开的工程内实现终端默认在当前文件的路径启动

树上的轮廓线DP!——AGC017F Zigzag

树上的轮廓线DP!——AGC017F Zigzag 注意到 \(n,m\le 20\),考虑状压,设 \(f_{i,S}\) 表示对于第 \(i\) 条线,其路线为 \(S\) 的方案数。 转移需要枚举 \(f_{i-1,S}\) 复杂度 \(\mathcal O(4^n\text{poly}(n))\)。 发现这种相邻状态之间的限制很像矩形中行的扩展,于是我们可…

使用 CSS flex(横向) 实现瀑布流布局(需要后端配合数据分左右)

核心代码(提供思路)<up-waterfall v-model="flowList"><template v-slot:left="{leftList}"><view v-for="(item, index) in leftList" :key="index"><!-- 这里编写您的内容,item为您传递给v-model的数组元素…

htb LinkVortex walkthrough

nmapnmap -p- -A -sS -T 4 10.10.11.47 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 00:58 UTC┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A -sS -T4 10.10.11.47 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-22 00:58 UTC Stats: 0:02:28 ela…

网络抓包文件太大,如何切分

背景 节前最后几天了,随便写点水文吧,今天就记录一下,当我们拿到的网络抓包文件太大,应该怎么分析。 一般来说,我们个人抓包的话,linux上用tcpdump比较多,抓的时候也会用捕获表达式,抓出来的包一般不大,用wireshark分析就很容易。 但是,前一阵的一个晚上,dba突然找我…

java进程内存占用分析

一、背景 1.1 问题描述 不知道大家在开发过程中有没有遇到过类似的问题,明明通过JVM参数-Xmx256m设置了最大堆内存大小为256m,但是程序运行一段时间后发现占用的内存明显超过了256m,却并没有出现内存溢出等问题,那是什么东西占用了额外的内存空间呢? 通过ps查看java进程项…

《ESP32-S3使用指南—IDF版 V1.6》第三章 ESP32-S3基础知识

第三章 ESP32-S3基础知识 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp3…

GDB - 查看崩溃程序maps映射表

可执行程序如何通过gdb查看映射信息? 在终端中打开gdb调试器:gdb 可执行文件名。 进入gdb调试器后,使用命令info proc mapping查看可执行程序的映射信息。 这个命令将会输出可执行程序的内存映射信息,包括可执行文件的代码段、数据段、堆和栈等信息,以及共享库的地址空间等…

Anthropic 计划为 Claude 发布「双向」语音模式;商汤「日日新」实时音视频对话服务开放商用丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

记录---当window.open被ios安全机制拦截,我掏出3种方案,终于跳转成功!

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣一、前言 今天在开发H5的时候,遇到了一个bug,就是在ios环境,在某些情况下执行window.open不生效,所以正好趁此机会研究了一下window.open。 二、window.open介绍 从open方法的调用方式可以看出,open方法是定义在Wind…