照常,上题目:J-甜甜圈_河南省第十三届ICPC大学生程序设计竞赛(重现赛) (nowcoder.com)
这种题,就一眼能看出来直接模拟肯定是不行的了
然后比赛的时候三个人就思考了下人生决定跳过
咳咳正经题解来了
每次移动的是一个区间,区间可以联想得到树状数组(奇怪的联想增加了!)
想象一下,把两叠甜甜圈的顶端相对

图有点随意大家将就点
然后相当于有个每次只能移动一格的指针,然后跳来跳去每次取出当前最大的甜甜圈
我们考虑建一个数组(脑子里)此时此位置有甜甜圈为1,没有为0
每次移动的步数就是指针位置和最大甜甜圈位置这个区间的数组的和
这不就是树状数组擅长的嘛
(然后有个b忘了longlong结果wa了还是队友发现的,十年oi一场空不写ll见祖宗)
管你听没听到,看就完了
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[200005],c[400005]; //对应原数组和树状数组
int b[200005], vis[6000007];
int lowbit(int x){
return x&(-x);
}
void updata(int i,int k){ //在i位置加上k
while(i <= n){
c[i] += k;
i += lowbit(i);
}
}
int getsum(int i){

博客围绕河南省第十三届ICPC大学生程序设计竞赛的J - 甜甜圈题目展开,指出直接模拟不可行。提出用树状数组解题,将两叠甜甜圈顶端相对,用指针取最大甜甜圈,移动步数是指针与最大甜甜圈位置区间数组的和,这正是树状数组擅长处理的。
最低0.47元/天 解锁文章
896

被折叠的 条评论
为什么被折叠?



