水题求助
查看原帖
水题求助
941431
Autream楼主2024/12/5 21:36

评测记录,求卡常或指出错误。

#include <bits/stdc++.h>
#define arrout(a, n) rep(i, 1, n) printk(a[i])
#define arrin(a, n) rep(i, 1, n) a[i] = read()
#define rep(i, x, n) for(int i = x; i <= n; i++)
#define dep(i, x, n) for(int i = x; i >= n; i--)
#define erg(i, x) for(int i = head[x]; i; i = e[i].nex)
#define dbg(x) std::cout << #x << ":" << x << " "
#define mem(a, x) memset(a, x, sizeof a)
#define all(x) x.begin(), x.end()
#define arrall(a, n) a + 1, a + 1 + n
#define PII std::pair<int, int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
// #define int long long
#define il inline
#define ss second
#define ff first
#define itn 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 = 5e4 + 5;
int n, q, a[N], b[N];
struct Basis {
	int p[32];
	Basis() { mem(p, 0); }
	void clear() { mem(p, 0); }
	void insert(int x) {
		if(!x) return ;
		dep(i, 31, 0) if((x >> i) & 1) {
			if(!p[i]) {
				p[i] = x;
				return ;
			}
			x ^= p[i];
		}
	}
	int find(int v) {
		int ans = v;
		dep(i, 31, 0) ans = std::max(ans, ans ^ p[i]);
		return ans;
	}
	Basis operator+(Basis b) const {
		Basis ans;
		dep(i, 31, 0) ans.insert(p[i]), ans.insert(b.p[i]);
		return ans;
	}
	Basis& operator+=(const Basis& b){ return *this = *this + b; }
} ans;
struct Binary_Indexed_Tree {
	int c[N];
	int lowbit(int x) { return x & (-x); }
	void update(int x, int v) { for(int i = x; i <= n; i += lowbit(i)) c[i] ^= v; }
	int query(int x) {
		int ans = 0;
		for(int i = x; i; i -= lowbit(i)) ans ^= c[i];
		return ans;
	}
} bit;
struct Segment_Tree {
#define ls k << 1
#define rs k << 1 | 1
	Basis s[N << 2];
	void pushup(int k) { s[k] = s[ls] + s[rs]; }
	void update(int x, int v, int k = 1, int l = 1, int r = n) {
		if(l == r) {
			s[k].clear(), s[k].insert(v);
			return ;
		}
		int mid = l + r >> 1;
		if(x <= mid) update(x, v, ls, l, mid);
		else update(x, v, rs, mid + 1, r);
		pushup(k);
	}
	Basis query(int x, int y, int k = 1, int l = 1, int r = n) {
		if(x <= l && r <= y) return s[k];
		int mid = l + r >> 1;
		Basis ans;
		if(x <= mid) ans = ans + query(x, y, ls, l, mid);
		if(y > mid) ans = ans + query(x, y, rs, mid + 1, r);
		return ans;
	}
#undef ls
#undef rs
} st;
signed main() {
	n = read(), q = read();
	arrin(a, n);
	rep(i, 1, n) b[i] = a[i] ^ a[i - 1], bit.update(i, b[i]), st.update(i, b[i]);
	while(q --) {
		int op = read(), l = read(), r = read(), v = read();
		if(op == 1) {
			bit.update(l, v), bit.update(r + 1, v);
			st.update(l, b[l] ^= v), st.update(r + 1, b[r + 1] ^= v);
		} else {
			int k = bit.query(l);
			if(l == r) { printl(std::max(k, k ^ v)); continue; }
			ans.clear();
			ans.insert(k);
			ans = st.query(l + 1, r), ans.insert(k);
			printl(ans.find(v));
		}
	}
	return 0;
}
2024/12/5 21:36
加载中...