首页 > 其他分享 >【vjudge训练记录】大一寒假专项训练——前缀和/差分

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

时间:2025-01-22 18:10:18浏览次数:1  
标签:前缀 训练 int vjudge long -- solve 大一 define

训练情况

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

标签:前缀,训练,int,vjudge,long,--,solve,大一,define
From: https://www.cnblogs.com/longxingx/p/18686361

相关文章

  • 日常训练2025-1-22
    日常训练2025-1-22FTokitsukazeandEliminate(hard)https://ac.nowcoder.com/acm/contest/67742/F思路(小巧思)标准的Trick题,构造一个样例来模拟一下会发现,在删的那个数的位置之后的每一种数都至少出现了一次,他是最后出现的。模拟这个过程就行。代码#include<bits/std......
  • 深度学习目标检测使用yolov8训练使用路障类数据集之_道路积水检测数据集并构建一个基
    道路积水检测数据集,23097张,yolo和voc1类,标注数量:0道路积水:133261imagenum:23097积水啦,怎么办构建基于YOLOv8的道路积水检测系统。两种标注方式(YOLO和VOC)。以下是完整的代码实现,包括数据加载、模型训练、评估和推理。1.安装依赖首先,确保您已经安装了所需的库,特......
  • 训练YOLOv8模型_胸部x光片检测数据集 且构建一个基于YOLOv8的胸部X光片检测系统 voc_y
    训练YOLOv8模型_胸部x光片检测数据集且构建一个基于YOLOv8的胸部X光片检测系统voc/yolo文章目录以下文字及代码仅供参考1.安装依赖2.数据准备3.文件内容3.1`datasets/chest_xray_detection/`目录3.2`Config.py`3.3`train.py`3.4`detect_tools.py`3.5`UIProgr......
  • 如何使用深度学习框架目标检测YOLOv8训练骨折检测模型涉及到准备数据集、设置环境、预
    如何使用深度学习框架目标检测YOLOv8训练骨折检测模型涉及到准备数据集、设置环境、预处理数据、定义模型、训练模型、评估模型性能、分析结果和可视化,以及开发用户界面识别骨折X光检测数据集骨折X光检测数据集YOLO20000一套全面的X射线图像,旨在促进使用计算机视觉技......
  • 深度学习目标检测框架训练使用YOLOv8训练钓鱼检测数据集 使用Flask或FastAPI等框架创
    深度学习目标检测框架训练使用YOLOv8训练钓鱼检测数据集并构建一个基于YOLOv8的钓鱼检测系统使用YOLOv8训练钓鱼检测数据集,如何针对钓鱼检测进行调整和实现的详细步骤。1.安装依赖确保安装了必要的库。对于钓鱼检测,所需的库应该与之前提供的相同,但请根据实际情况检查是......
  • 日常训练2025-1-21
    日常训练2025-1-21E双生双宿之错rating:1300https://ac.nowcoder.com/acm/contest/95323/E思路(数论)本题考查中位数定理,中位数有这样的性质:所有数与中位数的绝对差之和最小。中位数是数列中间的那个数,或者是中间的那两个数之一。所以最后得到的双生数组中的两种数即为数列......
  • 大一上简记
    Donotgogentleintothatgoodnight(送给大家一句本人很喜欢的诗句)前言本人刚结束大一上的大学生活,之前也看过很多相关的记录各种学习生活的文章,于是闲来无事,也决定记录一下,算是对过去的一种总结与回顾,也希望能够在这个地方分享自己的经历,见证自己的变化与成长。注:(可能......
  • 【PyTorch】使用回调和日志记录来监控模型训练
    就像船长依赖仪器来保持航向一样,数据科学家需要回调和日志记录系统来监控和指导他们在PyTorch中的模型训练。在本教程中,我们将指导您实现回调和日志记录功能,以成功训练模型。一、理解回调和日志记录回调和日志记录是PyTorch中有效管理和监控机器学习模型训练过程的基本工具。1......
  • 【牛客训练记录】牛客周赛 Round 77
    训练情况赛后反思打一半吃饭去了,C题看到ax+by=k的问题,简单的扩欧exgcd没反应过来,简单数论还是不熟悉TAT,D题DSU计算联通块大小时\(i\)打成\(a_i\)疯狂RE被硬控了十几分钟A题输出题目所述的第几个字符串即可#include<bits/stdc++.h>//#defineintlonglong#defin......
  • 寒假前半ACM训练总结
    基础算法方面:充分认识到了二分、贪心、双指针等基础算法的重要性,在CF、ATC等中的题和ACM中的题(听说)大多都仅考次类基础算法但是需要运用熟练,在此前我一直忽视了此类算法的重要性并且也忽视了思维的提升,导致比赛有时甚至会在此类基础算法题中卡住以往也忽视了对于思考程序......