QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#761530 | #9727. Barkley III | Nlll | WA | 0ms | 3664kb | C++17 | 5.0kb | 2024-11-19 00:22:13 | 2024-11-19 00:22:13 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Lim = (1ull << 63) - 1;
struct node{
ll v, z1, z2;
node(ll v = 0, ll z1 = 0, ll z2 = 0) : v(v), z1(z1), z2(z2) {}
node operator + (const node &x) const{
ll a, b, c;
a = v & x.v;
b = z1 | x.z1;
c = z2 | x.z2 | (z1 & x.z1);
return node(a, b, c);
}
};
struct SegTree{
int n;
vector<ll> And;
vector<node> a;
SegTree(int n) : n(n)
{
And.resize((n << 2) + 5);
a.resize((n << 2) + 5);
}
void _and(int k, int l, int r, ll v)
{
And[k] &= v;
if(l == r)
{
a[k] = node(a[k].v & v, a[k].z1 | (v ^ Lim), 0);
return;
}
a[k] = node(a[k].v, a[k].z1 | (v ^ Lim), a[k].z2 | (v ^ Lim));
}
void _change(int k, int l, int r, ll v)
{
a[k] = node(v, v ^ Lim, 0);
}
void pdown(int k, int l, int r)
{
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
if(And[k] != -1)
{
_and(k1, l, m, And[k]);
_and(k2, m + 1, r, And[k]);
And[k] = -1;
}
}
void pup(int k)
{
int k1 = k << 1, k2 = k1 | 1;
a[k] = a[k1] + a[k2];
}
void build(int k, int l, int r, vector<ll> &x)
{
And[k] = -1;
if(l == r)
{
_change(k, l, r, x[l]);
return;
}
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
build(k1, l, m, x);
build(k2, m + 1, r, x);
pup(k);
}
void build(vector<ll> &x)
{
build(1, 1, n, x);
}
void my_and(int k, int l, int r, int L, int R, ll v)
{
if(L <= l && R >= r)
{
_and(k, l, r, v);
return;
}
pdown(k, l, r);
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
if(L <= m) my_and(k1, l, m, L, R, v);
if(R > m) my_and(k2, m + 1, r, L, R, v);
pup(k);
}
void my_and(int l, int r, ll v)
{
my_and(1, 1, n, l, r, v);
}
void change(int k, int l, int r, int x, ll v)
{
if(l == r)
{
_change(k, l, r, v);
return;
}
pdown(k, l, r);
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
if(x <= m) change(k1, l, m, x, v);
else change(k2, m + 1, r, x, v);
pup(k);
}
void change(int x, ll v)
{
change(1, 1, n, x, v);
}
node que(int k, int l, int r, int L, int R)
{
if(L <= l && R >= r)
{
return a[k];
}
pdown(k, l, r);
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
node res = node(Lim, 0, 0);
if(L <= m) res = que(k1, l, m, L, R);
if(R > m) res = res + que(k2, m + 1, r, L, R);
return res;
}
node que(int l, int r)
{
return que(1, 1, n, l, r);
}
ll Find(int k, int l, int r, int L, int R, ll v)
{
if(l == r)
{
if(a[k].v & v) return -1;
return a[k].v;
}
pdown(k, l, r);
if(L <= l && R >= r)
{
if(a[k].v & v) return -1;
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
if((a[k1].v & v) == 0) return Find(k1, l, m, L, R, v);
if((a[k2].v & v) == 0) return Find(k2, m + 1, r, L, R, v);
return -1;
}
int m = (l + r) >> 1, k1 = k << 1, k2 = k1 | 1;
ll res = -1;
if(L <= m) res = Find(k1, l, m, L, R, v);
if(R > m && res == -1) res = Find(k2, m + 1, r, L, R, v);
return res;
}
ll Find(int l, int r, ll v)
{
return Find(1, 1, n, l, r, v);
}
};
void solve()
{
int n, q;
cin >> n >> q;
vector<ll> a(n + 1);
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
SegTree t(n);
t.build(a);
for(int i = 1; i <= q; i++)
{
int op;
cin >> op;
if(op == 1)
{
int l, r;
ll x;
cin >> l >> r >> x;
t.my_and(l, r, x);
}
else if(op == 2)
{
int s;
ll x;
cin >> s >> x;
t.change(s, x);
}
else
{
int l, r;
cin >> l >> r;
node res = t.que(l, r);
ll z = res.z1 ^ res.z2;
if(z)
{
ll a, b;
for(int i = 62; i >= 0; i--)
{
if(z & (1ll << i))
{
a = 1ll << i;
break;
}
}
b = t.Find(l, r, a);
res.v += ((b ^ Lim) & z);
}
cout << res.v << "\n";
}
}
}
int main()
{
cin.tie(0)->sync_with_stdio(false);
solve();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3644kb
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: 3664kb
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: 3540kb
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 4191514364198816289 0 1153488865559840256 1152922054496880128 4188986037212352033 3533641810948498945 8657043456 1730020640668059136 0 633397148123136 1729382296723653632 0 19574524...
result:
wrong answer 8th lines differ - expected: '633397148123136', found: '4191514364198816289'