T1:游戏体验
固定区间左端点,一边枚举区间右端点,一边计算把右端点加入当前区间后得到的区间总分数,时间复杂度为 。一个区间新加入一个数 要分 种情况: 出现一次,区间总分数加上 对应的分数; 出现两次,区间总分数减去 对应的分数; 出现三次及三次以上就不需要再考虑了。
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; inline void chmax(ll& x, ll y) { if (x < y) x = y; } int main() { int n; cin >> n; vector<int> a(n); rep(i, n) cin >> a[i]; int m; cin >> m; vector<int> x(m); rep(i, m) cin >> x[i], x[i]--; ll ans = 0; rep(l, m) { ll now = 0; vector<int> cnt(n); for (int r = l; r < m; ++r) { int i = x[r]; cnt[i]++; if (cnt[i] == 1) now += a[i]; else if (cnt[i] == 2) now -= a[i]; chmax(ans, now); } } cout << ans << '\n'; return 0; }
记 f[i]
表示以 为左端点在当前时刻的区间的得分
记 pre[i]
表示和位置 相同的数,上一个位置是什么?
当加入新的数 时,从上一个和 相同的之后一个位置到当前位置的所有 f[i]
都增加 分;从当前位置往左数第 个和 相同的位置的之后一个位置到上一个和 相同的位置之间的所有 f[i]
都减少 分;从上一个和 相同的位置开始的左边的所有 f[i]
都加上 分
有区间查询和区间更新,所以可以用线段树来维护。但这里 是 ,会比较卡线段树,所以需要用zkw线段树。
T2:区间交集(三)
70 分做法:
见 link
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异