首页 > 其他分享 >LOJ #10180. 「一本通 5.5 练习 1」烽火传递

LOJ #10180. 「一本通 5.5 练习 1」烽火传递

时间:2022-10-25 11:37:41浏览次数:77  
标签:10180 min LOJ tree int ans ask change 5.5


题目链接:​​传送门​

表示处理到第个位置的最小花费
很明显转移要从之前的个位置转移过来
就是
最后答案要取
这样转移是的,但足以通过本题的
正解是单调队列优化
由于只是求一个区间的最小值,所以线段树也可以,我下面写了

暴力

#include <bits/stdc++.h>
#define

using namespace std;
int n, a[A], f[A], m, ans = A;

int main(int argc, char const *argv[]) {
cin >> n >> m; memset(f, 0x3f, sizeof f); f[1] = 0;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
for (int j = i - 1; j >= max(1, i - m); j--)
f[i] = min(f[i], f[j] + a[i]);
for (int i = n - m + 1; i <= n; i++) ans = min(ans, f[i]);
cout << ans << endl;
}

线段树优化,相比单调队列多了常数还大:

#include <bits/stdc++.h>
#define

using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
int n, a[A], f[A], m, ans = A;
struct node {int l, r, w;}tree[A];
void build(int k, int l, int r) {
tree[k].l = l; tree[k].r = r; tree[k].w = inf;
if (l == r) return;
int m = (l + r) >> 1;
build(k << 1, l, m); build(k << 1 | 1, m + 1, r);
}
void change(int k, int pos, int val) {
if (tree[k].l == tree[k].r) {tree[k].w = val; return;}
int m = (tree[k].l + tree[k].r) >> 1;
if (pos <= m) change(k << 1, pos, val);
else change(k << 1 | 1, pos, val);
tree[k].w = min(tree[k << 1].w, tree[k << 1 | 1].w);
}
int ask(int k, int l, int r) {
if (tree[k].l >= l and tree[k].r <= r) return tree[k].w;
int m = (tree[k].l + tree[k].r) >> 1, ans = inf;
if (l <= m) ans = min(ans, ask(k << 1, l, r));
if (r > m) ans = min(ans, ask(k << 1 | 1, l, r));
return ans;
}

int main(int argc, char const *argv[]) {
cin >> n >> m; build(1, 1, n); change(1, 1, 0);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
change(1, i, min(ask(1, i, i), ask(1, max(1, i - m), max(1, i - 1)) + a[i]));
cout << ask(1, n - m + 1, n) << endl;
}


标签:10180,min,LOJ,tree,int,ans,ask,change,5.5
From: https://blog.51cto.com/lyle/5794324

相关文章

  • LOJ #6175. 「美团 CodeM 初赛 Round B」黑白树
    题目链接:​​传送门​​一个很贪心的数位dp显然从叶节点开始染色是优的因为相比更靠上的节点来说会染到更多的节点那就先去染叶节点,在他的父亲节点处判断是否被覆盖如果......
  • LOJ #10005. 「一本通 1.1 练习 1」数列极差
    题目链接:​​传送门​​贪心题才是难的按照从小到大的顺序排,这样相乘会得到最大值,因为后面的最大值乘的更多最小值同理,就是从大到小处理就可以但是注意在操作的过程中不......
  • LOJ #3011. 「JOI 2019 Final」画展
    题目链接:​​传送门​​用最大的画框配最大的画显然是最优的那么挨个匹配就行#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglongll;pair<int,int>......
  • LOJ #2012. 「SCOI2016」背单词
    题目链接:​​传送门​​显然第一个情况和第二个情况不如第三个更优并且他们可以避免,所以尽量构造第三种情况将每个字符倒着插入trie树,因为先放后面的字符串是更优的然后......
  • LOJ #6208. 树上询问
    题目链接:​​传送门​​线段树维护每个点的k,t,d当做懒标记来维护这就需要对懒标记的理解了#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglongll;......
  • LOJ #6220. sum
    题目链接:​​传送门​​官方题解:有一个结论:必有连续的一串数和为n的倍数证明:先求个前缀和若这个前缀和中有的倍数,则这个前缀即为答案若这个前缀和中没有的倍数,即模余~......
  • LOJ #10202. 「一本通 6.2 练习 5」樱花
    题目链接:​​传送门​​​​别人的题解​​​不想写那么多latex了化完式子之后就是求的约数个数#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglong......
  • 游戏修改-Insect.Swarm.v0.5.5
    FileName=..\InsectSwarm_Data\Managed\Assembly-CSharp.dllPathList\0000\Descrip=CrystalFrags::multiplyingPathList\0000\NewHex=02027BC00000041F0A6A5A7DC00......
  • loj3053
    引言它还是来了。这题我尝试写过一次,寄了。然后开摆了。现在决定重新补一补这题。敬请收看:myee调长剖调到CSP还没有调出来的惨状!欢迎来看我什么时候补掉。当然也可......
  • loj3885. 「eJOI2022」Bounded Spanning Tree
    草稿:非树边\(u,v,[l,r]\)把\(u,v\)路径上所有边上界与\(r-1\)取个\(\min\)。剩下的边左端点排序后贪心,每次取右端点最小的一个元素。开始只考虑树边。当前加入一......