社区讨论
全 TLE 求助
P5607[Ynoi2013] 无力回天 NOI2017参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo10x60p
- 此快照首次捕获于
- 2023/10/22 13:23 2 年前
- 此快照最后确认于
- 2023/11/02 12:54 2 年前
rt,再交要变成卡评测了
CPP#include <iostream>
using namespace std;
int a[1000005], pref[1000005];
void _addd(int x, int v) {
while (x <= 500001) {
pref[x] ^= v;
x += x & -x;
}
}
int _query(int x) {
int summ=0;
while (x) {
summ ^= pref[x];
x -= x & -x;
}
return summ;
}
long long highbit(long long x) {
return x ? (63 - __builtin_clzll(x)) : 64;
}
struct TLEWA {
int v[100];
TLEWA(int x=0) {
for (int i=30; i-->0; ) v[i] = 0;
v[64] = 0;
v[highbit(x)] = x;
}
}
sc84bbs[200005];
TLEWA insert(TLEWA Cubic, int x) {
while (Cubic.v[highbit(x)]) x ^= Cubic.v[highbit(x)];
Cubic.v[highbit(x)] = x;
return Cubic;
}
TLEWA operator + (TLEWA x, TLEWA y) {
for (int i=30; i-->0; ) x = insert(x, y.v[i]);
return x;
}
TLEWA query(int l, int r, int n, int x, int y) {
if (x > y) return TLEWA(0);
if (l == x && y == r) return sc84bbs[n];
int mid = (l + r) / 2;
if (y <= mid) return query(l, mid, n<<1, x, y);
if (x > mid) return query(mid+1, r, n<<1|1, x, y);
return query(l, mid, n<<1, x, mid) + query(mid+1, r, n<<1|1, mid+1, y);
}
void addd(int l, int r, int n, int x, int v) {
//cout << l << ' ' << r << ' ' << n << ' ' << x << ' ' << v << endl;
if (l == r) {
sc84bbs[n] = TLEWA(v);
return;
}
int mid = (l + r) / 2;
x <= mid ? addd(l, mid, n<<1, x, v) : addd(mid+1, r, n<<1|1, x, v);
sc84bbs[n] = sc84bbs[n<<1] + sc84bbs[n<<1|1];
//for (int i=30; i-->0; ) cout << sc84bbs[n].v[i] << ' '; cout << endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m, op, l, r, x, rzh=0, cncagn;
cin >> n >> m;
for (int i=1; i<=n; i++) cin >> a[i], cncagn = a[i], a[i] ^= rzh, rzh = cncagn, addd(1, n, 1, i, a[i]), _addd(i, a[i]);
while (m--) {
cin >> op >> l >> r >> x;
if (op == 1) {
a[l] ^= x;
r < n && (a[r+1] ^= x);
_addd(l, x);
if (r < n) _addd(r+1, x);
addd(1, n, 1, l, a[l]);
if (r < n) addd(1, n, 1, r+1, a[r+1]);
} else {
TLEWA t = TLEWA(_query(l)) + query(1, n, 1, l+1, r);
int w = x;
for (int i=30; i-->0; ) if (!((w >> i) & 1)) w ^= t.v[i];
cout << w << endl;
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...