社区讨论
关于带修莫队的修改
学术版参与者 5已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @lo2q3sdu
- 此快照首次捕获于
- 2023/10/23 17:56 2 年前
- 此快照最后确认于
- 2023/10/23 17:56 2 年前
为啥带修莫队中的修改是先修改完后移动的,就如:
CPP //直接开始交换
rep(i, 1, T) ops[i].x = a[ops[i].p]/*未交换的值*/, a[ops[i].p] = ops[i].y;
sort(qu + 1, qu + qcnt + 1, cmp);
int tm = T; //时间戳
for(int i = 1, l = qu[1].l, r = qu[1].l - 1; i <= qcnt; i++){
while(l < qu[i].l) Del(a[l++]);
while(r > qu[i].r) Del(a[r--]);
while(l > qu[i].l) Add(a[--l]);
while(r < qu[i].r) Add(a[++r]);
while(tm < qu[i].pre) tm++, modify(ops[tm].p, ops[tm].y, l, r);
while(tm > qu[i].pre) modify(ops[tm].p, ops[tm].x, l, r), tm--;
ans[qu[i].id] = query();
}
我有另一种想法就是先不修改,但错了
如下:
CPP //直接开始交换
rep(i, 1, T) ops[i].x = a[ops[i].p]/*未交换的值*/;
sort(qu + 1, qu + qcnt + 1, cmp);
int tm = 0; //时间戳
for(int i = 1, l = qu[1].l, r = qu[1].l - 1; i <= qcnt; i++){
//?顺序
while(l < qu[i].l) Del(a[l++]);
while(r > qu[i].r) Del(a[r--]);
while(l > qu[i].l) Add(a[--l]);
while(r < qu[i].r) Add(a[++r]);
while(tm < qu[i].pre) tm++, modify(ops[tm].p, ops[tm].y, l, r);
while(tm > qu[i].pre) modify(ops[tm].p, ops[tm].x, l, r), tm--;
ans[qu[i].id] = query();
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...