当前位置: 首页 > news >正文

题解:AT_arc150_f [ARC150F] Constant Sum Subsequence

题意:给出一个 \(n\) 长序列 \(A\),其拓展出来的 \(n^2\) 长度序列 \(B\) 是其复制 \(n\) 份的结果。现在给出一个 \(s\),求一个最小的 \(l\),满足对于任意的 \(x\)\(s=x_1+x_2\cdots x_k\),则 \(x\)\(B_1,B_2,\cdots B_l\) 的一个子序列。\(s\le n\le 1.5\times 10^6,s\le 2\times 10^5\),保证序列中 \([1,s]\) 都出现至少一次。

做法:

首先我们会一个 \(O(s^2)\) 的 dp,记 \(dp_{i}\) 代表已经满足了和为 \(i\) 的拆分,答案为多少,那么转移就是枚举再接一个 \(x\),然后令 \(dp_{i+x}\)\(\operatorname{nxt}(dp_i,x)\)\(\max\),这里 \(\operatorname{nxt}(x,y)\) 的意义为,从下标 \(x\) 开始,下一个 \(y\) 的位置在哪里,正确性显然。但是时间完全过不了。

我们考虑这是一个 1D-1D 的转移,考虑怎么优化一下。我们可以考虑分治一下,这样就只用考虑 \([l,mid]\)\([mid+1,r]\) 的贡献。但是还是不好转移,没有什么性质。

我们先显然地发现 dp 数组是单调的。考虑什么时候比较有性质,那么得是同一个 \(y\) 这样我们 \(\operatorname{nxt}(x,y)\) 才有比较好的性质,对固定的一个 \(y\) 进行分析,那么我们发现,\(dp_i\) 如果对 \(dp_{i+x}\) 去尝试产生贡献,如果 \(\operatorname{nxt}(dp_{i},x)\)\(\operatorname{nxt}(dp_{mid}, x)\) 相比更小,那我们肯定不用 \(i\)\(i+x\) 更新,而因为 dp 数组单调,所以只有这两个值相等的时候才有用。所以我们可以直接找一个 \(\operatorname{pre}(dp_{mid}, x)\),要求 \(dp_i\ge pre\) 才可以贡献,可以二分找到这个位置,然后直接对 \([mid+1,r]\) 中的元素区间取 \(\max\) 即可,用线段树维护一下就行,总复杂度 \(O(s\log^2s)\)

需要注意一些等号上的细节。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1.5e6 + 5;
int n, s, a[maxn], f[maxn];
vector<int> v[maxn];
int get_nxt(int p, int k) {p += n;p %= n;int pos = upper_bound(v[k].begin(), v[k].end(), p) - v[k].begin();if(pos == v[k].size())return v[k][0] + n - p;return v[k][pos] - p;
}
int get_pre(int p, int k) {p += n;p %= n;int pos = upper_bound(v[k].begin(), v[k].end(), p) - v[k].begin();if(pos == 0)return n - v[k][v[k].size() - 1] + p;elsereturn p - v[k][pos - 1];
}
struct Segtree {int tr[(int)(8e5 + 5)];void build(int l, int r, int t) {tr[t] = -1;if(l == r) {tr[t] = -1;return ;}int mid = l + r >> 1;build(l, mid, t << 1), build(mid + 1, r, t << 1 | 1);//	cout << l << " " << r << " " << tr[t] << " " << t << endl;}void update(int l, int r, int x, int y, int t, int val) {if(x <= l && r <= y) {tr[t] = max(tr[t], val);return ;}int mid = l + r >> 1;if(x <= mid)update(l, mid, x, y, t << 1, val);if(mid < y)update(mid + 1, r, x, y, t << 1 | 1, val);}int query(int l, int r, int pos, int t, int val) {//	cout << t << " " << tr[t] << endl;if(l == r)return tr[t];int mid = l + r >> 1;if(pos <= mid)return max(query(l, mid, pos, t << 1, val), tr[t]);return max(query(mid + 1, r, pos, t << 1 | 1, val), tr[t]);}
} tree;
void solve(int l, int r) {if(l == r) {f[l] = tree.query(0, s, l, 1, 0);//	cout << l << " " << f[l] << endl;return ;}int mid = l + r >> 1;solve(l, mid);for (int i = 1; i <= r - l; i++) {int nt = f[mid] + get_nxt(f[mid], i), pr = f[mid] - get_pre(f[mid], i);int lx = l - 1, rx = mid;while(lx + 1 < rx) {int mid = lx + rx >> 1;if(f[mid] >= pr)rx = mid;elselx = mid;}int ll = max(rx + i, mid + 1), rr = min(r, mid + i);//	cout << l << " " << r << " " << i  << " " << pr << " " << ll << " " << rr << " " << nt << endl;tree.update(0, s, ll, rr, 1, nt);}solve(mid + 1, r);
}
signed main() {cin >> n >> s;for (int i = 0; i < n; i++)cin >> a[i], v[a[i]].push_back(i);f[0] = -1;tree.build(0, s, 1);
//	cout << tree.query(0, s, 0, 1, 0) << endl;solve(0, s);cout << f[s] + 1 << endl;return 0;
}
/*
5 5
5 1 3 4 2
*/
http://www.jsqmd.com/news/409156/

相关文章:

  • 2026年2月国内上海移民中介公司靠谱推荐:正规机构优选飞际移民 - 资讯焦点
  • 需求-技术需求
  • Kali Linux 安装全攻略:U盘启动/双系统/虚拟机(附常见报错解决)
  • 需求-需求分组
  • NMN哪个牌子好?2026年NMN十大品牌排行榜:W+端粒塔凭实力霸榜 - 资讯焦点
  • Kali Linux 2026 零基础入门到实战:保姆级超详细教程(建议收藏)
  • C语言从入门到进阶——第10讲:操作符详解
  • 《构建之法》读书笔记
  • LoRA 为什么必须把一个矩阵初始化为0
  • 2026年广州蕾蒙威手表维修推荐榜单评测:非官方专业售后网点服务选择指南 - 十大品牌推荐
  • 2026年广州蕾蒙威手表维修推荐榜单:非官方维修网点服务评测与选择指南 - 十大品牌推荐
  • 2026年广州理查米尔手表维修推荐榜单:非官方维修点售后网点服务评测 - 十大品牌推荐
  • 2026年广州雷达手表维修网点推荐评测:非官方服务中心选择指南与避坑排名 - 十大品牌推荐
  • NMN市场的贫富差距:普通人在纠结价格,1%的精英早已在吃奥本元 - 资讯焦点
  • 《梦断代码》读书笔记
  • 2026年广州雷达手表维修推荐榜单:非官方维修网点服务评测与选择指南 - 十大品牌推荐
  • 2026年广州雷达手表维修网点推荐评测:非官方服务中心榜单与选择避坑指南 - 十大品牌推荐
  • 2026年广州康斯登手表维修推荐评测:非官方维修点选择指南与网点服务排名分析 - 十大品牌推荐
  • MATLAB通过网格搜索和交叉验证优化 SVR 的两个关键参数惩罚因子和核函数参数,以提高模型的预测精度
  • 2026年广州孔雀表手表维修推荐榜单:非官方维修点评测与售后网点选择指南 - 十大品牌推荐
  • 2026年广州浪琴手表维修评测推荐:非官方网点服务排名与售后选择指南 - 十大品牌推荐
  • 2026年广州劳力士手表维修推荐评测:非官方维修点选择指南与全国服务网点排名 - 十大品牌推荐
  • 2026年广州孔雀表手表维修推荐榜单:非官方维修点售后网点服务评测 - 十大品牌推荐
  • 视频孪生时代的终结镜像视界空间神经中枢与前向空间控制引擎
  • 2026年广州劳力士手表维修评测与排名:非官方网点服务售后中心选择指南 - 十大品牌推荐
  • 2026年广州劳力士手表维修推荐榜单:非官方维修点甄选与售后网点服务评测 - 十大品牌推荐
  • 2026年广州康斯登手表维修推荐榜单:非官方维修点评测与网点服务指南 - 十大品牌推荐
  • 2026年广州朗格手表维修推荐榜单:非官方维修网点服务评测与选择指南 - 十大品牌推荐
  • 《人月神话》读书笔记
  • 2026年广州浪琴手表维修推荐榜单:非官方维修点甄选与售后网点服务评测 - 十大品牌推荐