QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#176595#6427. Just Another Game of StoneshazeWA 0ms3628kbC++233.1kb2023-09-11 20:08:142023-09-11 20:08:15

Judging History

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

  • [2023-09-11 20:08:15]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3628kb
  • [2023-09-11 20:08:14]
  • 提交

answer

#pragma GCC optimize("Ofast")
#pragma GCC target("avx2,abm,mmx")
#include<bits/stdc++.h>
#define ll long long
#define irep(i,l,r) for(ll i = l; i <= r; ++i)
using namespace std;
inline ll read(){
	ll s=0; bool fl = 0;
	char chcc=getchar();
	while(chcc<'0'||chcc>'9'){if(chcc == '-')fl = 1;chcc = getchar();}
	while(chcc>='0'&&chcc<='9') s=(s<<3)+(s<<1)+(chcc^48),chcc=getchar();
	return fl?-s:s;
}
const int N = 1200999;
const int itinf = 1000000000;
int n, m;
struct node{
int bsum[31];
//	vector<int>bsum;
	int xorsum, mn, smn, len, tag;
	node(){}
}t[N];
void fdmn(vector<int>aa, int &mn, int &smn){
	sort(aa.begin(), aa.end());
	unique(aa.begin(), aa.end());
	mn = aa[0], smn = aa[1];
}
void update(int x){
	fdmn({t[x*2].mn, t[x*2].smn, t[x*2+1].mn, t[x*2+1].smn}, t[x].mn, t[x].smn);
	t[x].len = 0, t[x].xorsum = t[x*2].xorsum ^ t[x*2+1].xorsum;
	if(t[x*2].mn == t[x].mn)t[x].len += t[x*2].len;
	if(t[x*2+1].mn == t[x].mn)t[x].len += t[x*2+1].len;
	irep(i,0,31)t[x].bsum[i] = t[x*2].bsum[i] + t[x*2+1].bsum[i];
}

void operate(int x,int lim){
	if(t[x].len & 1)t[x].xorsum ^= (lim ^ t[x].mn);
	t[x].tag = lim;
	int od = t[x].mn, nw = lim;
	irep(i,0,31){
		t[x].bsum[i] += ((nw & 1) - (od & 1)) * t[x].len;
		nw >>= 1, od >>= 1;
	}
	t[x].mn = lim;
}

void pushdown(int x){
	int tag = t[x].tag;
	t[x].tag = 0;
	if(t[x*2].mn < tag)operate(x*2,tag);
	if(t[x*2+1].mn < tag)operate(x*2+1,tag);
}

void build(int x,int l,int r){
	if(l == r){
		int val;
		val = t[x].mn = t[x].xorsum = read();
		t[x].len = 1;
		t[x].smn = t[x].tag = itinf;
		irep(i,0,31){
			t[x].bsum[i] += val & 1;
			val >>= 1;
		}
		return;
	}
	int mid = (l + r) >> 1;
	build(x * 2,l, mid);
	build(x * 2 + 1, mid + 1, r);
	update(x);
	return;
}
void modify(int x,int l,int r,int L,int R, int lim){
	// x -> max(x, val)
	if(l > R || L > r)return;
	if(L <= l && r <= R){
		if(lim <= t[x].mn)return;
		pushdown(x);
		if(lim < t[x].smn){
			operate(x,lim);
			return;
		}
		int mid = (l + r) >> 1;
		if(l == r)return;
		modify(x * 2,l, mid, L,R,lim);
		modify(x * 2 + 1, mid + 1, r ,L,R,lim);
		update(x);
		return;
	}
	pushdown(x);
	int mid = (l + r) >> 1;
	modify(x * 2,l, mid, L,R,lim);
	modify(x * 2 + 1, mid + 1, r ,L,R,lim);
	update(x);
	return;
}
int xor_query(int x,int l,int r,int L,int R){
	if(l > R || L > r)return 0;
	if(L <= l && r <= R)return t[x].xorsum;
	if(l != r)pushdown(x);
	int mid = (l + r) >> 1;
	return xor_query(x*2,l,mid,L,R) ^ xor_query(x*2+1,mid+1,r,L,R);
}
int bit_cnt(int x,int l, int r, int L ,int R,int id){
	if(l > R || L > r)return 0;
	if(L <= l && r <= R)return t[x].bsum[id];
	if(l != r)pushdown(x);
	int mid = (l + r) >> 1;
	return bit_cnt(x *2 ,l,mid,L,R,id) + bit_cnt(x*2+1,mid+1,r,L,R,id);
}
int main(){
	n = read(), m = read();
	build(1,1,n);
	while(m --){
		int op = read(), l = read(), r = read(), x = read();
		if(op == 1){
			modify(1,1,n,l,r,x);
		}else{
			ll key = xor_query(1,1,n,l,r);
			if((key ^ x) == 0){
				puts("0");
				continue;
			}
			int hb = log2(key ^ x);
			ll ans = bit_cnt(1,1,n,l,r,hb);
			if(x & (1 << hb))++ ans;
			printf("%lld\n",ans);
		}
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3628kb

input:

5 4
1 2 1 4 1
2 1 3 1
1 2 4 3
2 2 4 4
2 1 4 4

output:

0
0
2

result:

wrong answer 1st numbers differ - expected: '1', found: '0'