QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#759362#9727. Barkley IIIzzuqyWA 0ms3704kbC++144.6kb2024-11-18 02:59:012024-11-18 02:59:01

Judging History

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

  • [2025-01-13 03:55:43]
  • hack成功,自动添加数据
  • (/hack/1447)
  • [2024-11-18 02:59:01]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3704kb
  • [2024-11-18 02:59:01]
  • 提交

answer

#include<cstdio>
#include<algorithm>
#include<cmath>
unsigned long long updateLow(unsigned long long l0, unsigned long long l1, 
							 unsigned long long r0, unsigned long long r1){
	return ((~l1) & (~l0) & (~r1) & (r0)) | ((~l1) & (l0) & (~r1) & (~r0));
}
unsigned long long updateHigh(unsigned long long l0, unsigned long long l1,
							  unsigned long long r0, unsigned long long r1){
	return ~(((~l1) & (~l0) & (~r1) & (~r0)) | ((~l1) & (~l0) & (~r1) & (r0)) | 
			 ((~l1) & (l0) & (~r1) & (~r0)));
}
struct Node{
	Node *ls, *rs;
	unsigned long long x0, x1, and_, tag;
	inline void pushUp(){
		and_ = ls->and_ & rs->and_;
		x0 = updateLow(ls->x0, ls->x1, rs->x0, rs->x1);
		x1 = updateHigh(ls->x0, ls->x1, rs->x0, rs->x1);
	}
	inline void update(unsigned long long t, int len){
		tag &= t;
		and_ &= t;
		
		unsigned long long x0_, x1_;
		if(len >= 2){
			x0_ = (~x1) & x0 & t;
			x1 = ~((~x1) & t);
		} 
		else{
			x0_ = ~and_;
			x1_ = 0;
		}
		x0 = x0_;
		x1 = x1_;
	}
	inline void pushDown(int l, int mid, int r){
		if(tag == (unsigned long long)-1){
			return;
		}
		
		ls->update(tag, mid-l+1);
		rs->update(tag, r-mid);
		tag = -1;
	}
};
#define N 1000006
int n;
Node addr_[N*2], *addr = addr_, *root = addr;
unsigned long long a[N];
void build(Node *x, int l, int r){
	x->tag = -1;
	if(l == r){
		x->and_ = a[l];
		x->x0 = ~a[l];
		x->x1 = 0;
		return;
	}
	x->ls = ++addr;
	x->rs = ++addr;
	int mid = (l+r) >> 1;
	build(x->ls, l, mid);
	build(x->rs, mid+1, r);
	x->pushUp();
}
void change(Node *x, int l, int r, int pos, unsigned long long k){
	if(l == r){
		x->and_ = k;
		x->x0 = ~k;
		x->x1 = 0;
		return;
	}
	int mid = (l+r) >> 1;
	x->pushDown(l, mid, r);
	if(pos <= mid) change(x->ls, l, mid, pos, k);
	else change(x->rs, mid+1, r, pos, k);
	x->pushUp();
}
void changeAnd(Node *x, int l, int r, int ql, int qr, unsigned long long k){
	if(ql <= l && r <= qr){
		x->update(k, r-l+1);
		return;
	}
	int mid = (l+r) >> 1;
	x->pushDown(l, mid, r);
	if(ql <= mid) changeAnd(x->ls, l, mid, ql, qr, k);
	if(qr > mid) changeAnd(x->rs, mid+1, r, ql, qr, k);
	x->pushUp();
}
unsigned long long askAnd(Node *x, int l, int r, int ql, int qr){
	if(ql <=l && r <= qr){
		return x->and_;
	}
	unsigned long long ans = -1;
	int mid = (l+r) >> 1;
	x->pushDown(l, mid, r);
	if(ql <= mid) ans &= askAnd(x->ls, l, mid, ql, qr);
	if(qr > mid) ans &= askAnd(x->rs, mid+1, r, ql, qr);
	return ans;
}
void findBit(Node *x, int l, int r, int ql, int qr,
			 unsigned long long &x0, unsigned long long &x1){
	if(ql <= l && r <= qr){
		x0 = x->x0;
		x1 = x->x1;
		return;
	}
	int mid = (l+r) >> 1;
	x->pushDown(l, mid, r);
	if(qr <= mid) findBit(x->ls, l, mid, ql, qr, x0, x1);
	else if(ql > mid) findBit(x->rs, mid+1, r, ql, qr, x0, x1);
	else{
		unsigned long long l0 = 0, l1 = 0, r0 = 0, r1 = 0;
		findBit(x->ls, l, mid, ql, qr, l0, l1);
		findBit(x->rs, mid+1, r, ql, qr, r0, r1);
		x0 = updateLow(l0, l1, r0, r1);
		x1 = updateHigh(l0, l1, r0, r1);
	} 
}
int findPos(Node *x, int l, int r, unsigned long long musk){
	if(l == r){
		return l;
	}
	int mid = (l+r) >> 1;
	x->pushDown(l, mid, r);
	if(x->ls->and_ & musk) return findPos(x->rs, mid+1, r, musk);
	return findPos(x->ls, l, mid, musk); 
}
int findPos(Node *x, int l, int r, int ql, int qr, unsigned long long musk){
	if(ql <= l && r <= qr){
		if(x->and_ & musk) return -1;
		return findPos(x, l, r, musk);
	}
	int mid = (l+r) >> 1;
	x->pushDown(l, mid, r);
	int ll = -1, rr = -1;
	if(ql <= mid) ll = findPos(x->ls, l, mid, ql, qr, musk);
	if(qr > mid) rr = findPos(x->rs, mid+1, r, ql, qr, musk);
	return ll == -1 ? rr : ll;
}
int main(){
	int q;
	scanf("%d%d",&n, &q);
	for(int i = 1; i <= n; i++){
		scanf("%llu", a+i);
	}
	build(root, 1, n);
	while(q--){
		int op, l, r;
		unsigned long long x;
		scanf("%d", &op);
		if(op == 1){
			scanf("%d%d%llu", &l, &r, &x);
			changeAnd(root, 1, n, l, r, x);
		}
		else if(op == 2){
			scanf("%d%llu", &l, &x);
			change(root, 1, n, l, x);
		}
		else{
			scanf("%d%d", &l, &r);
			unsigned long long x0 = 0, x1 = 0;
			findBit(root, 1, n, l ,r, x0, x1);
			int bit = 63;
			while(bit >= 0){
				if(((x1 >> bit) & 1) == 0 && ((x0 >> bit) & 1) == 1){
					break;
				}
				bit--;
			}
			unsigned long long ans = -1;
			if(l == r){
				ans = 0;
			}
			else if(bit == -1){
				ans = askAnd(root, 1, n, l+1, r);
			}
			else{
				int pos = findPos(root, 1, n, l, r, 1ull << bit);
				if(pos != l){
					ans &= askAnd(root, 1, n, l, pos-1);
				}
				if(pos != r){
					ans &= askAnd(root, 1, n, pos+1, r);
				}
			}
			printf("%llu\n", ans);
		}
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3664kb

input:

5 9
7 7 7 6 7
3 1 5
2 1 3
3 1 5
3 1 3
1 1 2 3
3 1 3
2 2 8
3 1 3
3 1 2

output:

7
6
7
3
3
8

result:

ok 6 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 3704kb

input:

10 10
6760061359215711796 1568091718842717482 1568091718842717482 1568091718842717482 5232472783634052627 8795942500783873690 1568091718842717482 1568091718842717482 1568091718842717482 1568091718842717482
1 3 5 7587422031989082829
3 6 10
1 7 8 5197616143400216932
2 4 2518604563805514908
2 2 4533959...

output:

1568091718842717482
35184908959744
176025477579040
8795942500783873690

result:

ok 4 lines

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 3652kb

input:

100 100
4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 625967318191814868 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072...

output:

576531121047601152
1
576460752303423488
4263579105072360993
1306043896232411137
4263579105072360993
576531121047601152
633397148123136
0
12952010752
562951027425280
1730020640668059136
3458764518266578433
67108864
576531718266945536
0
633397148123136
1729382296723653632
0
1730020640668059136
3533641...

result:

wrong answer 10th lines differ - expected: '1153488865559840256', found: '12952010752'