QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#761530#9727. Barkley IIINlllWA 0ms3664kbC++175.0kb2024-11-19 00:22:132024-11-19 00:22:13

Judging History

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

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

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'