题解:P1360 [USACO07MAR] Gold Balanced Lineup G

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

先读题

很好的STL练习题,不用STL做那你是这个(这里有一个拇指)

暴力#

很容易看出来是前缀和存储每个能力值,然后暴力枚举均衡时期的起点和终点,并遍历每项技能在这段均衡时期的增长数是否一致,如果一致,则在end - start + 1 , ans中取max

显而易见,这样暴力的时间复杂度是O(mn2)O(mn^2),对于1n105,1m301 \leq n \leq 10^5,1 \leq m \leq 30的数据,时间限制还只有一秒的题是不够看的

正解#

于是我们注意到,如果所有技能的能力值和其中某项的差在经历几天后仍不变,这就意味着所有技能的能力值都提升了相同的次数

所以,我们可以用map存储所有技能的能力值和其中某项的差所代表的时间

在第ii天如果map中已有此项,则在i - map[differences] + 1 , ans中取max

如果没有,则将map[differences]设定为ii

然后你就拿到了68pts68pts,因为第一天也是均衡时期,所以要将map中全为零的情况也初始化为00

ACcodeAC code:#

#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 long
using 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/
作者
WanFoxAZX
发布于
2026-08-24
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
WanFoxAZX
Hello, I'm AZX.
公告
Welcome!
分类
标签
最新动态

还没有发布动态

更多动态
站点统计
文章
10
动态
0
分类
6
标签
5
总字数
2,549
运行时长
0
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.15.5
文章许可
CC BY-NC-SA 4.0