洛谷 P3353 在你窗外闪耀的星星

题意:给定一个宽度w,n个数,每个数有一个权值。窗口可以变换位置,求该窗口能容纳的最大权值。

思路:前缀和+滑动窗口硬算。

总结:一开始感觉是fenwicktree,但是每次查询的区间固定,不需要fenwicktree,不如滑动窗口来的方便。

void solve(){
int n, w;
cin >> n >> w;

vector a(n);
vector b(n);
int maxn = 0;
for (int i = 0; i < n; ++i){
cin >> a[i] >> b[i];
maxn = max(maxn, a[i]);
}

vector pref(maxn + 1);
for (int i = 0; i < n; ++i){
pref[a[i]] += b[i];
}
for (int i = 1; i <= maxn; ++i){
pref[i] += pref[i - 1];
}

long long ans = 0;
for (int i = w; i <= maxn; ++i){
ans = max(ans, pref[i] - pref[i - w]);
}

cout << ans << endl;
}

posted @ 2024-04-22 09:18  _Yxc  阅读(43)  评论(0)    收藏  举报