题解:P1360 [USACO07MAR] Gold Balanced Lineup G
418 字
2 分钟
题解:P1360 [USACO07MAR] Gold Balanced Lineup G

先读题
很好的STL练习题,不用STL做那你是这个(这里有一个拇指)
暴力
很容易看出来是前缀和存储每个能力值,然后暴力枚举均衡时期的起点和终点,并遍历每项技能在这段均衡时期的增长数是否一致,如果一致,则在end - start + 1 , ans中取max
显而易见,这样暴力的时间复杂度是,对于的数据,时间限制还只有一秒的题是不够看的
正解
于是我们注意到,如果所有技能的能力值和其中某项的差在经历几天后仍不变,这就意味着所有技能的能力值都提升了相同的次数
所以,我们可以用map存储所有技能的能力值和其中某项的差所代表的时间
在第天如果map中已有此项,则在i - map[differences] + 1 , ans中取max
如果没有,则将map[differences]设定为
然后你就拿到了,因为第一天也是均衡时期,所以要将map中全为零的情况也初始化为
:
#include<iostream>#include<string>#include<string.h>#include<vector>#include<queue>#include<map>#include<stack>#include<set>#include<functional>#include<utility>#include<algorithm>#include<cmath>#include<climits>#include<tuple>#include<numeric>#include<any>#include<bitset>#define int long longusing namespace std;const int N = 1e5 + 10, M = 31;int n, m, maxx;vector<int> numb(M);map<vector<int>, int> mp;signed main() { cin.tie(nullptr)->ios::sync_with_stdio(false); cin >> n >> m; mp[vector<int>(M)] = 0; for (int i = 1;i <= n;i++) { int num; cin >> num; bitset<M> bs(num); for (int j = 0;j < M;j++) numb[j] += bs[j]; vector<int> cz(M); for (int i = 0;i < m;i++) cz[i] = numb[i] - numb[0]; if (mp.count(cz)) maxx = max(i - mp[cz], maxx); else mp[cz] = i; } cout << maxx; return 0;}支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
题解:P1360 [USACO07MAR] Gold Balanced Lineup G
https://azx.xn--0iv.gay/posts/solution-p1360/相关文章智能推荐
1
题解:P1111 修复公路
题解题解:P1111 修复公路
2
题解:P5690 [CSP-S 2019 江西] 日期
题解题解:P5690 [CSP-S 2019 江西] 日期
3
一些冷门但好用的STL容器
OISTL真的很好用
4
关于我的OI代码缺省源
OI以后懒得写了直接复制
5
从0写软件-Win32应用代码模板
C++有点像大份
随机文章随机推荐











