社区讨论

关于带修莫队的修改

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...