QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#114629#6631. Maximum Bitwise ORwillow#WA 80ms8636kbC++142.2kb2023-06-22 17:53:412023-06-22 17:53:45

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 17:53:45]
  • 评测
  • 测评结果:WA
  • 用时:80ms
  • 内存:8636kb
  • [2023-06-22 17:53:41]
  • 提交

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 arr[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);
		for(int j = 0; j < 30; ++ j)
			if(a[l] >> j & 1)
				v.push_back(j);
		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];
			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]);
	}
}
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 <= 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 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;
			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 = max(lx, i);
					rx = min(rx, i);
				}
			}
			printf("%d %d\n", ((1 << (now.high + 1)) - 1), 1 + (Ask(1, 1, n, l, r, rx) > lx));
		}
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 8636kb

input:

1
3 2
10 10 5
1 2
1 3

output:

15 2
15 0

result:

ok 4 number(s): "15 2 15 0"

Test #2:

score: -100
Wrong Answer
time: 80ms
memory: 8448kb

input:

100000
1 1
924704060
1 1
1 1
149840457
1 1
1 1
515267304
1 1
1 1
635378394
1 1
1 1
416239424
1 1
1 1
960156404
1 1
1 1
431278082
1 1
1 1
629009153
1 1
1 1
140374311
1 1
1 1
245014761
1 1
1 1
445512399
1 1
1 1
43894730
1 1
1 1
129731646
1 1
1 1
711065534
1 1
1 1
322643984
1 1
1 1
482420443
1 1
1 1
20...

output:

1073741823 1
268435455 1
536870911 1
1073741823 1
536870911 1
1073741823 1
536870911 1
1073741823 1
268435455 1
268435455 1
536870911 1
67108863 1
134217727 1
1073741823 1
536870911 1
536870911 1
268435455 1
536870911 1
536870911 1
536870911 1
268435455 1
268435455 1
1073741823 1
16777215 1
10737418...

result:

wrong answer 2nd numbers differ - expected: '2', found: '1'