QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#114641#6631. Maximum Bitwise ORwillow#RE 0ms0kbC++143.1kb2023-06-22 18:11:062023-06-22 18:11:07

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-22 18:11:07]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2023-06-22 18:11:06]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int T, n, q, a[maxn];
#define lc (o << 1)
#define rc (o << 1 | 1)
#define mid ((l + r) >> 1)
#define lson lc, l, mid
#define rson rc, mid + 1, r
struct Node {
	int v, high;
	Node(int v = 0, int high = -1) : v(v), high(high) {}
	void Init(int x) {
		v = x;
		high = -1;
		if(x) {
			high = 0;
			while((1 << high) <= x)
				++ high;
			-- high;
		}
	}
}tror[maxn << 2];
Node Merge(Node a, Node b) {
	return Node(a.v | b.v, max(a.high, b.high));
}
int Mer(int a, int b) {
	if(a == -1 || b == -1 || (a > 0 && b > 0))
		return -1;
	if(a > 0 && b == 0)
		return a;
	if(b > 0 && a == 0)
		return b;
	return 0;
}
int arr[maxn << 2][32], cnt[maxn << 2][32];
void Build(int o, int l, int r) {
	if(l == r) {
		tror[o].Init(a[l]);
		vector<int> v;
		v.clear();
		v.push_back(-1);
		memset(cnt[o], 0, sizeof arr[o]);
		for(int j = 0; j < 30; ++ j)
			if(a[l] >> j & 1) {
				v.push_back(j);
				cnt[o][j] = l;
			}
		memset(arr[o], 0x3f, sizeof arr[o]);
		for(int j = 0; j + 1 < (int)v.size(); ++ j) {
			int lp = v[j] + 1, rp = v[j + 1];
// cerr << "Pos: " << l << " " << lp << " " << rp << endl;
			for(int x = lp; x <= rp; ++ x) {
				arr[o][x] = lp;
			}
		}
		return;
	}
	Build(lson), Build(rson);
	tror[o] = Merge(tror[lc], tror[rc]);
	for(int j = 0; j < 32; ++ j) {
		arr[o][j] = min(arr[lc][j], arr[rc][j]);
		assert(arr[o][j] <= j);
		cnt[o][j] = Mer(cnt[lc][j], cnt[rc][j]);
	}
}
Node Get(int o, int l, int r, int ql, int qr) {
	if(ql <= l && r <= qr)
		return tror[o];
	Node x;
	if(ql <= mid)
		x = Merge(x, Get(lson, ql, qr));
	if(qr > mid)
		x = Merge(x, Get(rson, ql, qr));
	return x;
}
int Ask(int o, int l, int r, int ql, int qr, int rp) {
	if(ql > qr)
		return 1e9;
	if(ql <= l && r <= qr)
		return arr[o][rp];
	int x = 1e9;
	if(ql <= mid)
		x = min(x, Ask(lson, ql, qr, rp));
	if(qr > mid)
		x = min(x, Ask(rson, ql, qr, rp));
	return x;
}
int Que(int o, int l, int r, int ql, int qr, int pos) {
	if(ql <= l && r <= qr)
		return cnt[o][pos];
	int x = 0;
	if(ql <= mid)
		x = Mer(x, Que(lson, ql, qr, pos));
	if(qr > mid)
		x = Mer(x, Que(rson, ql, qr, pos));
	return x;
}
int main() {
	for(scanf("%d", &T); T --; ) {
		scanf("%d%d", &n, &q);
		for(int i = 1; i <= n; ++ i) {
			scanf("%d", &a[i]);
		}
		Build(1, 1, n);
		for(int l, r; q --; ) {
			scanf("%d%d", &l, &r);
			Node now = Get(1, 1, n, l, r);
			// cerr << now.v << " " << now.high << endl;
			assert(now.v < (1 << (now.high + 1)));
			if(now.v == ((1 << (now.high + 1)) - 1)) {
				printf("%d %d\n", now.v, 0);
				continue;
			}
			int lx = 31, rx = -1;
			for(int i = 0; i <= now.high; ++ i) {
				if(!(now.v >> i & 1)) {
					lx = min(lx, i);
					rx = max(rx, i);
				}
			}
			assert(lx <= rx);
			int p = Que(1, 1, n, l, r, now.high);
			int x = Ask(1, 1, n, l, r, rx);
			if(p > 0)
				x = min(Ask(1, 1, n, l, p - 1, rx), Ask(1, 1, n, p + 1, r, rx));
// cerr << Ask(1, 1, n, l, r, rx) << " " << now.v << " " << lx << " " << rx << endl;
			printf("%d %d\n", ((1 << (now.high + 1)) - 1), 1 + (x > lx));
		}
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Dangerous Syscalls

input:

1
3 2
10 10 5
1 2
1 3

output:


result: