社区讨论

超大常数代码求卡常

P5278算术天才⑨与等差数列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjayav1
此快照首次捕获于
2025/11/03 23:36
4 个月前
此快照最后确认于
2025/11/03 23:36
4 个月前
查看原帖
只有50pts /wul
CPP
#include <bits/stdc++.h>
#define rep(i, x, n) for(int i = x; i <= n; ++i)
#define arrin(a, n) rep(i, 1, n) a[i] = read()
#define all(x) x.begin(), x.end()
#define CI const int
int read() {
	char ch = getchar();
	int r = 0, w = 1;
	while(ch < '0' || ch > '9') w = ch == '-' ? -1 : w, ch = getchar();
	while(ch >= '0' && ch <= '9') r = (r << 3) + (r << 1) + (ch ^ 48), ch = getchar();
	return r * w;
}

void print(int x) {
	if(x < 0) putchar('-'), x = -x;
	if(x >= 10) print(x / 10);
	putchar(x % 10 + '0');
}template<typename ...Args>
void print(int t, Args... args) { print(t), print(args...); }

void printl(int x) { print(x), putchar('\n'); }
template<typename ...Args>
void printl(int t, Args... args) { printl(t), printl(args...); }

void printk(int x) { print(x), putchar(' '); }
template<typename ...Args>
void printk(int t, Args... args) { printk(t), printk(args...); }

CI N = 3e5 + 5;
int n, q, lstans, a[N];
std::unordered_map<int, std::set<int>> mp;
struct Segment_Tree {
#define ls k << 1
#define rs k << 1 | 1
	int ma[N << 2], mi[N << 2], gcd[N << 2];
	void pushup(int k) {
		ma[k] = std::max(ma[ls], ma[rs]);
		mi[k] = std::min(mi[ls], mi[rs]);
		gcd[k] = std::__gcd(gcd[ls], gcd[rs]);
	}
	void build(int k = 1, int l = 1, int r = n) {
		if(l == r) return ma[k] = mi[k] = gcd[k] = a[l], void();
		int mid = l + r >> 1;
		build(ls, l, mid), build(rs, mid + 1, r);
		pushup(k);
	}
	void update(int x, int v, int k = 1, int l = 1, int r = n) {
		if(l == r) return ma[k] = mi[k] = gcd[k] = v, void();
		int mid = l + r >> 1;
		if(x <= mid) update(x, v, ls, l, mid);
		else update(x, v, rs, mid + 1, r);
		pushup(k);
	}
	int queryma(int x, int y, int k = 1, int l = 1, int r = n) {
		if(y < l || x > r) return -1e9;
		if(x <= l && r <= y) return ma[k];
		int mid = l + r >> 1, ans = -1e9;
		if(x <= mid) ans = std::max(ans, queryma(x, y, ls, l, mid));
		if(y > mid) ans = std::max(ans, queryma(x, y, rs, mid + 1, r));
		return ans;
	}
	int querymi(int x, int y, int k = 1, int l = 1, int r = n) {
		if(y < l || x > r) return 1e9;
		if(x <= l && r <= y) return mi[k];
		int mid = l + r >> 1, ans = 1e9;
		if(x <= mid) ans = std::min(ans, querymi(x, y, ls, l, mid));
		if(y > mid) ans = std::min(ans, querymi(x, y, rs, mid + 1, r));
		return ans;
	}
	int querygcd(int x, int y, int k = 1, int l = 1, int r = n) {
		if(y < l || x > r) return 0;
		if(x <= l && r <= y) return gcd[k];
		int mid = l + r >> 1, ans = 0;
		if(x <= mid) ans = std::__gcd(ans, querygcd(x, y, ls, l, mid));
		if(y > mid) ans = std::__gcd(ans, querygcd(x, y, rs, mid + 1, r));
		return ans;
	}
#undef ls
#undef rs
} st1, st2, st3; // st1:序列最值,GCD;st2:差分;st3:前驱
signed main() {
	n = read(), q = read();
	arrin(a, n);
	st1.build();
	rep(i, 1, n) {
		if(mp[a[i]].empty()) mp[a[i]].insert(0);
		st2.update(i, abs(a[i] - a[i - 1])), st3.update(i, *mp[a[i]].rbegin());
		mp[a[i]].insert(i);
	}
	while(q --) {
		int op = read(), l = read() ^ lstans, r = read() ^ lstans;
		if(op == 1) {
			auto pre = std::l_b(all(mp[a[l]]), l), nex = std::u_b(all(mp[a[l]]), l);
			if(nex != mp[a[l]].end()) st3.update(*nex, *--pre);
			mp[a[l]].erase(l);
			st1.update(l, r), st2.update(l, abs(r - a[l - 1])), st2.update(l + 1, abs(a[l + 1] - r));
			a[l] = r;
			if(mp[r].empty()) mp[r].insert(0);
			mp[r].insert(l);
			pre = std::l_b(all(mp[r]), l), nex = std::u_b(all(mp[r]), l);
			if(nex != mp[r].end()) st3.update(*nex, l);
			st3.update(l, *--pre);
		}
		if(op == 2) {
			if(l > r) std::swap(l, r);
			int k = read() ^ lstans;
			if(l == r) { puts("Yes"), lstans ++; continue; }
			if(!k) {
				st1.queryma(l, r) == st1.querymi(l, r) ? puts("Yes"), lstans ++ : puts("No");
				continue;
			}
			int flag = 1;
			flag &= st1.queryma(l, r) - st1.querymi(l, r) == (r - l) * k;
			flag &= st2.querygcd(l + 1, r) == k;
			flag &= st3.queryma(l, r) < l;
			lstans += flag, puts(flag ? "Yes" : "No");
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...