社区讨论
超大常数代码求卡常
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 条回复,欢迎继续交流。
正在加载回复...