Week4 题解

news/2025/11/18 23:35:37/文章来源:https://www.cnblogs.com/ecsilvia/p/19239725

洛谷题解

A

不知道为什么题目挂了, 直接求前缀和板子题, 这题甚至不用开 ll

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;constexpr int inf = 0x3f3f3f3f;void solve(){int n;cin >> n;vector<int> a(n + 1);for(int i=1; i<=n; i++){cin >> a[i];}vector<int> pre(n + 1);for(int i=1; i<=n; i++){pre[i] = pre[i-1] + a[i];}for(int i=1; i<=n; i++){cout << pre[i] << " \n"[i == n];}}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

B

求个差分就行

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;constexpr int inf = 0x3f3f3f3f;void solve(){int n;cin >> n;vector<int> a(n + 1);for(int i=1; i<=n; i++){cin >> a[i];}vector<int> diff(n + 1);for(int i=1; i<=n; i++){diff[i] = a[i] - a[i-1];}for(int i=1; i<=n; i++){cout << diff[i] << " \n"[i == n];}}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

C

区间快速加应用

时间复杂度 O(q + n)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;constexpr int inf = 0x3f3f3f3f;void solve(){int n, q;cin >> n >> q;vector<int> a(n + 2);for(int i=1; i<=n; i++){cin >> a[i];}vector<ll> diff(n + 2);for(int i=1; i<=n; i++){diff[i] = a[i] - a[i-1];}for(int i=0; i<q; i++){int x, y, v;cin >> x >> y >> v;diff[x] += v;diff[y+1] -= v;}for(int i=1; i<=n; i++){a[i] = a[i-1] + diff[i];}cout << *min_element(a.begin()+1, a.begin()+1+n) << '\n';// for(int i=1; i<=n; i++){//     cout << a[i] << " \n"[i == n];// }}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

D

可以二值化, G为1, R为-1

当选取的字串 cntG 等于 cntR 时则稳定, 也就是区间和为 0 时

区间和为零也就是 preL == preR , 代表 [L+1, R] 的区间是稳定的

GGRRG

1 2 1 0 1

因此 , 我们用 map 记录前缀和数组中每种值的最早出现的位置

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;constexpr int inf = 0x3f3f3f3f;void solve(){string s;cin >> s;int n = s.size();s = " " + s;vector<ll> pre(n + 1);for(int i=1; i<=n; i++){pre[i] = (s[i]=='G'? 1:-1);}for(int i=1; i<=n; i++){pre[i] += pre[i-1];}map<ll, int> mp;mp[0] = 0; // 初始化 0 的情况int ans = 0;for(int i=1; i<=n; i++){if(mp.count(pre[i])) ans = max(ans, i-mp[pre[i]]);else mp[pre[i]] = i;}cout << ans << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

E

n <= 120, 直接 O(n^4) 暴力遍历所有矩阵, 用前缀和优化求和

#include <bits/stdc++.h>
using namespace std;void solve(){int n;cin >> n;vector<vector<int>> a(n + 1, vector<int>(n + 1));vector<vector<int>> pre(n + 1, vector<int>(n + 1));for(int r = 1; r <= n; r++){for(int c = 1; c <= n; c++){cin >> a[r][c];}}for(int r = 1; r <= n; r++){for(int c = 1; c <= n; c++){pre[r][c] = pre[r-1][c] + pre[r][c-1] - pre[r-1][c-1] + a[r][c];}}int ans = 0;for(int r1=1; r1<=n; r1++){for(int r2=r1; r2<=n; r2++){for(int c1=1; c1<=n; c1++){for(int c2=c1; c2<=n; c2++){int s = pre[r2][c2]- pre[r1-1][c2]- pre[r2][c1-1]+ pre[r1-1][c1-1];ans = max(ans, s);}}}}cout << ans << '\n';
}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);solve();return 0;
}

F

注意 x, y 可能等于 0 , 并且一个点可能有多个目标

#include <bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){int n, m;cin >> n >> m;vector<vector<int>> mat(5000 + 2, vector<int>(5000 + 2, 0));vector<vector<int>> pre(5000 + 2, vector<int>(5000 + 2, 0));for(int i = 0; i < n; i++){int x, y, v;cin >> x >> y >> v;mat[x + 1][y + 1] += v; // 平移坐标轴}for(int r = 1; r <= 5000 + 1; r++){for(int c = 1; c <= 5000 + 1; c++){pre[r][c] = mat[r][c] + pre[r-1][c] + pre[r][c-1] - pre[r-1][c-1];}}int ans = 0;for(int r = 1; r + m - 1 <= 5000 + 1; r++){for(int c = 1; c + m - 1 <= 5000 + 1; c++){int x1 = r, y1 = c;int x2 = r + m - 1, y2 = c + m - 1;int s = pre[x2][y2] - pre[x1 - 1][y2] - pre[x2][y1 - 1] + pre[x1 - 1][y1 - 1];ans = max(ans, s);}}cout << ans << '\n';
}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);solve();return 0;
}

G

二位前缀和板题 , 矩形区域加

#include <bits/stdc++.h>
using namespace std;void solve(){int n, m;cin >> n >> m;vector<vector<int>> diff(n + 2, vector<int>(n + 2, 0));for(int i = 0; i < m; i++){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;diff[x1][y1] += 1;diff[x1][y2 + 1] -= 1;diff[x2 + 1][y1] -= 1;diff[x2 + 1][y2 + 1] += 1;}vector<vector<int>> ans(n + 1, vector<int>(n + 1, 0));for(int r = 1; r <= n; r++){for(int c = 1; c <= n; c++){ans[r][c] = diff[r][c] + ans[r-1][c] + ans[r][c-1] - ans[r-1][c-1];}}for(int r = 1; r <= n; r++){for(int c = 1; c <= n; c++){cout << ans[r][c] << " ";}cout << '\n';}
}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);solve();return 0;
}

H

只有两个方向 , 先选定一个方向 , 然后枚举向前走多远后折返走相反方向

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int n, m;cin >> n >> m;const int MX = 1e6;int ext = 0;vector<int> L(MX + 1), R = L;for(int i=0; i<n; i++){int x; cin >> x;if(x < 0) L[-x]++;if(x == 0) ext++;if(x > 0) R[x]++;}for(int i=1; i<=MX; i++){L[i] += L[i-1];R[i] += R[i-1];}int ans = 0;for(int i=0; i<=MX; i++){int rest = m - 2*i;if(rest < 0) break;rest = min(rest, MX);ans = max(ans, L[i]+R[rest]+ext);}for(int i=0; i<=MX; i++){int rest = m - 2*i;if(rest < 0) break;rest = min(rest, MX);ans = max(ans, L[rest]+R[i]+ext);}cout << ans << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

G

博弈, 可以发现, 无论怎么取, 在取完之前无法停止, 所以数一下石子总数即可

总数量奇数 Alice 赢

总数量偶数 Bob 赢

#include <bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){int n;cin >> n;ll sum = 0;for(int i=0; i<n; i++){int x; cin >> x;sum += x;}cout << (sum&1? "Alice":"Bob") << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);solve();return 0;
}

周赛题解

7-1

因为是被 10 整除, 可以直接放在 %10 的意义下来看

当 pre[L] == pre[R] 时 , 也就是 sum[L+1, R] 的和为 0 (mod 10 意义下)

然后和作业题 D 就几乎是一道题了

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int n;cin >> n;vector<int> a(n + 1);for(int i=1; i<=n; i++){cin >> a[i];}vector<ll> pre(n + 1);for(int i=1; i<=n; i++){pre[i] = pre[i-1] + a[i];}vector<int> fir(10, inf);fir[0] = 0;int ans = 0;for(int i=1; i<=n; i++){ans = max(ans, i-(fir[pre[i]%10]));        fir[pre[i]%10] = min(fir[pre[i]%10], i);}cout << ans << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-2

区间加简单题

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+5;
const int mod=998244353;
int a[N];
void run(){int n,m;cin>>n>>m;for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y>>z;a[x]+=z;a[y+1]-=z;}for(int i=1;i<=n;i++){a[i]+=a[i-1];}for(int i=1;i<=n;i++){cout<<a[i]<<' ';}
}
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T=1;
//    cin>>T;while(T--)run();return 0;
}

7-3

区间加简单题

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int n, k;cin >> n >> k;vector<int> a(n + 2);for(int i=1; i<=k; i++){int x, y;cin >> x >> y;a[x]++, a[y+1]--;}for(int i=1; i<=n; i++){a[i] += a[i-1];}sort(a.begin()+1, a.begin()+1+n);cout << a[(n+1)/2] << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-4

需要先转化一下, 因为一天大概不到 1e5s, 开个数组然后用差分快速区间加即可

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int MX = 1e5;vector<int> d(MX + 2);int n; cin >> n;for(int i=0; i<n; i++){int h1, m1, s1;int h2, m2, s2;scanf("%d:%d:%d", &h1, &m1, &s1);scanf("%d:%d:%d", &h2, &m2, &s2);int x = h1*3600 + m1*60 + s1;int y = h2*3600 + m2*60 + s2;d[x]++, d[y+1]--;}int ans = 0;for(int i=1; i<=MX; i++){d[i] += d[i-1];ans = max(ans, d[i]);}cout << ans << '\n';}int main(){int t = 1; //cin >> t;while(t--) solve();
}

7-5

按题意模拟判断一下即可

#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T, S, t;if (!(cin >> T >> S >> t)) return 0;if (T >= 35 && t >= 33 && S == 1) {cout << "Bu Tie" << '\n' << T << '\n';} else if (T >= 35 && t >= 33 && S == 0) {cout << "Shi Nei" << '\n' << T << '\n';} else if (S == 1) {cout << "Bu Re" << '\n' << t << '\n';} else {cout << "Shu Shi" << '\n' << t << '\n';}return 0;
}

7-6

用双端队列存, 然后开个标记

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int q; cin >> q;deque<int> dq;bool ori = true;for(int i=0; i<q; i++){int op; cin >> op;if(op == 1){int x; cin >> x;if(ori) dq.push_back(x);else dq.push_front(x);}if(op == 2 && !dq.empty()){if(ori) dq.pop_front();else dq.pop_back();}if(op == 3) ori ^= 1;if(dq.empty()) cout << -1 << '\n';else cout << (dq.front()^dq.back()) << '\n';}}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-7

贪心, 其实是求字典序最大, 我们将数字转化成字典序后按照 a+b > b+a 的顺序 sort 即可

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int n;while(cin >> n){vector<string> a(n);for(int i=0; i<n; i++){int x; cin >> x;a[i] = to_string(x);}sort(a.begin(), a.end(), [](string x, string y){return x+y > y+x;});for(auto x : a) cout << x;cout << '\n';}}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-8

从 x 到 y , 相当于 [x, y] 的次数都加了 1, 最后能得到每条路都经过了几次 , 在两种选择中取最优即可

#include<bits/stdc++.h>
#define int long long
#define itn int
#define endl '\n'
#define pii pair<int,int>
using namespace std;
const int MAX=1e6+7;
const int mod=1e9+7;
int p[MAX],a[MAX],b[MAX],c[MAX];
int sum[MAX];
void run(){int n,m;cin >>n>>m;for(int i=1;i<=m;i++){cin >>p[i];}for(int i=1;i<n;i++){cin >>a[i]>>b[i]>>c[i];}p[0]=1;for(int i=2;i<=m;i++){int mx=max(p[i],p[i-1]),mn=min(p[i],p[i-1]);sum[mn]++,sum[mx]--;}for(int i=1;i<n;i++){sum[i]+=sum[i-1];}int ans=0;for(int i=1;i<n;i++){
//		cout <<sum[i]<<' ';ans+=min(a[i]*sum[i],b[i]*sum[i]+c[i]);}cout <<ans<<endl;
}
/*
*/
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//	cin >>t;for(int i=0;i<t;i++) run();return 0;
}

7-9

需要动态的维护 sum 和 k 个值, 注意取模

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;
constexpr int mo = 1e9;void solve(){int n, k;cin >> n >> k;deque<int> dq(k, 1);int sum = k;for(int i=k; i<=n; i++){dq.push_back(sum);sum *= 2;sum -= dq.front();sum = (sum % mo + mo) % mo; // 防负dq.pop_front();}cout << dq.back() << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-10

整理一下式子, 其实就是 A1 * sum[2, n] + A2 * sum[3, n]...

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int n;cin >> n;vector<int> a(n + 1);ll sum = 0;for(int i=1; i<=n; i++){cin >> a[i];sum += a[i];}ll ans = 0;for(int i=1; i<=n; i++){sum -= a[i];ans += a[i] * sum;}cout << ans << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-11

这个题要从差分数组来看 , 每次操作等价于在差分数组选两个点一加一减, 或一减一加, 或单点±, 最后要求差分数组全为 0 (除了 d[1])

从差分数组来看就容易不少, 在上述操作下, 最小操作次数为 max(pos, neg)

\({pos = \sum_{i=2,di>0}^{n}d_i}\)

\({neg = \sum_{i=2,di<0}^{n}|d_i|}\)

因为当 pos, neg 都非 0 时, 我们最优肯定是进行一次操作操作让 pos--, neg--

当有一个为 0, 我们就只能让剩下的 --,

操作次数也就是 |pos-neg| + min(pos, neg) = max(pos, neg)

最后剩下的也就是 d[1]

d[1] 在第二步有一个为 0 时可以顺带进行操作

可能的种类数就是 |pos-neg| + 1

#include <bits/stdc++.h>
using namespace std;
using ll = long long;constexpr int inf = 0x3f3f3f3f;void solve(){int n;cin >> n;vector<int> a(n + 1);for(int i=1; i<=n; i++){cin >> a[i];}vector<int> d(n + 1);d[1] = a[1];int pos = 0, neg = 0;for(int i=2; i<=n; i++){d[i] = a[i] - a[i-1];if(d[i] > 0) pos += d[i];if(d[i] < 0) neg -= d[i];}cout << max(pos, neg) << '\n';cout << abs(pos-neg) + 1 << '\n';}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1; //cin >> t;while(t--) solve();return 0;
}

7-12

作业原题 , 参考作业 F 题 , 请在洛谷上提交

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

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

相关文章

linux c 宏

在 Linux 系统中,C 宏(也称为 预处理宏)是 C 语言中用于代码处理的一种机制,主要用于代码的条件编译、宏定义等。在 Linux 系统中,C 宏通常在编译过程中由编译器(如 gcc)处理,用于实现代码的条件编译、宏替换等…

linux c 图形

您提到的“Linux C 图形”可能是指在 Linux 系统中使用 C 语言开发图形界面应用程序,或者是在 Linux 环境下使用 C 语言实现图形界面功能。以下是几种常见的 Linux C 图形开发方式和相关命令/工具:一、使用 C 语言开…

AcWing 1628:判断红黑树

【题目来源】https://www.acwing.com/problem/content/1630/【题目描述】数据结构中有一类平衡的二叉搜索树,称为红黑树。它具有以下 5 个属性:(1)节点是红色或黑色。(2)根节点是黑色。(3)所有叶子都是黑色。(…

2025年11月留学中介避坑指南:前十机构实力解析,不同需求对应选

2025年11月留学中介避坑指南:前十机构实力解析,不同需求对应选一、2025年留学机构怎么选?这五个问题你一定在关心 作为深耕国际教育咨询领域十余年的从业者,每天都会接待大量为留学机构选择而焦虑的学生和家长。20…

2025年11月出国留学咨询机构排行榜:从申请到就业全维度推荐

2025年11月出国留学咨询机构排行榜:从申请到就业全维度推荐一、2025年出国留学咨询机构怎么选?这些困惑你是否也有 作为深耕国际教育咨询领域十年的从业者,每天都会接到大量学生和家长的咨询。2025年留学申请季已进…

Universal 3-Button Flip Remote Key for PSA Type (5pcs/lot) – Easy Replacement for Euro/American Cars

The Challenge: PSA Key Replacement Woes For automotive repair shops and PSA vehicle owners alike, finding a reliable, cost-effective remote key replacement can be a frustrating experience. Dealerships …

Nginx日志配置

一、概述 Nginx日志是服务器运维与问题排查的核心支撑,能够精准记录客户端请求详情、服务响应状态、处理耗时等关键信息,为故障定位、性能优化、安全审计和流量分析提供可靠数据依据。Nginx具备灵活的日志记录机制,…

Avalonia框架安装 - -YADA

概述 Avalonia 是一个开源的跨平台 UI 框架,使开发者能够使用 .NET 为 Windows、macOS、Linux、iOS、Android 和 WebAssembly 创建应用程序。 它使用自己的渲染引擎来绘制 UI 控件,确保在所有支持的平台上具有一致的…

常用基础算法程序

常用的基础算法程序 1.高位数逐位取出 逆序输出: #include <iostream> using namespace std;int main() {int n;cin >> n;while (n){cout << n % 10;n /= 10;}return 0; }正序输出(使用递归): #…

Cypher多深度查询

在 Cypher 中,深度查询的核心是「可变长度关系语法」,用于匹配节点间多步(多深度)的关联关系。它的核心格式、用法场景、常见问题及最佳实践如下,结合之前的示例系统化梳理: 一、核心语法:可变长度关系 匹配 n …

linux c 内核

你提到的“Linux C 内核”可能涉及多个方面,包括但不限于:Linux 内核的 C 语言接口 Linux 内核的 C 语言开发 Linux 内核的 C 语言模块 Linux 内核的 C 语言实现 以下是一些常见的 Linux 内核相关 C 语言内容…

linux c xml

你提到的“Linux C XML”可能有几种不同的含义,我将根据常见场景进行解释:1. Linux 系统中使用 C 语言处理 XML 数据 如果你是想在 Linux 系统中使用 C 语言处理 XML 数据(如解析、生成 XML 文件等),可以使用以下…

2025出国留学机构哪家强?5大靠谱品牌深度测评

2025出国留学机构哪家强?5大靠谱品牌深度测评一、2025年出国留学机构怎么选?这五个问题你一定在纠结​ 作为深耕国际教育规划领域十余年的咨询师,每天都有大量学生和家长向我咨询出国留学机构的选择问题。2025年留学…

build multi version repository on rhel9

1.Download key vim 0.download_gpg_key.sh #!/bin/bash BASE_DIR="/home/rhel9-local-repo" echo "=== 下载GPG密钥 ===" # 下载Red Hat GPG密钥curl -L -o $BASE_DIR/keys/RPM-GPG-KEY-redhat-r…

2025.11.18总结

今天差不多将AI故事创作的项目完成,除了基本的三个api的使用以外,还添加了以下的额外功能使其更像一个商业软件 1.登录注册 2.自己生成的故事列表 3.收藏故事 4.每个故事中的每个字加上拼音和能够单独读这个字供儿童…

Wavelet tree

具体学习可参考: 原文 知乎翻译版本 速通: 假设初始的数组是 \(T\)。 init 初始化。 我们假设值域的最高 bit 位是 \(up\)。考虑从 \(up\) 开始往低位扫,每次我们把当前的 \(T\) 按照这一位的值做稳定排序并创建新版…

买完学习机还需要去线下补课吗? AI 学习机 + 自习室是中小学生普娃的更优解!

买完学习机还需要去线下补课吗? "AI 学习机 + 自习室"是中小学生普娃的更优解!当孩子成绩不理想时,单一依赖 AI 学习机常陷入 “诊断不深、练习盲目、缺乏监督” 的困境 —— 而 2025 年异军突起的黑马品牌…

251118

251118今天我发现了世界的三大奥秘 1 偏执转移,人对某些事物会产生强迫性的偏执,例如过度整洁,必须用同一个水杯喝水等等,在涉及相关的精神原始创伤被解决之前,偏执会一直存在,并且会以不同形式表现出来 2 图文印…

拥护UE4.27、UE5.0、UE5.1、UE5.2、UE5.3、UE5.4、UE5.5的VS2022一键安装技巧

拥护UE4.27、UE5.0、UE5.1、UE5.2、UE5.3、UE5.4、UE5.5的VS2022一键安装技巧pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

Dify VS LangGraph

目录1. 优先选择 Dify 的场景2. 优先选择 LangGraph 或 LangChain 高代码开发的场景总结:核心决策依据参考资料 实际落地中,也可结合使用:例如用 Dify 快速搭建 MVP 验证需求,待业务稳定后,将核心复杂逻辑用 Lang…