QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#234875#4429. Gebyte's GrindraulandreipopRE 0ms0kbC++235.4kb2023-11-02 00:43:082023-11-02 00:43:08

Judging History

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

  • [2023-11-02 00:43:08]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2023-11-02 00:43:08]
  • 提交

answer

#include <iostream>
#include <vector>

using namespace std;
using ll = long long;
const int NMAX = 2e6;
const ll INF = 1e18 + 5;

struct function {
    ll a, b, y;
    ll eval (ll x)
    {
        if (x <= a) return 0;
        else if (a < x && x <= b) return y;
        else return x-b+y;
    }
    
    function o (function f2)
    {
        ll new_a , new_b , new_y;
        if (a < f2.y) {
            new_a = f2.a;
        }
        else if (a == f2.y)
        {
            new_a = f2.b;
        }
        else {
            new_a = a + f2.b - f2.y;
        }
        new_y = y;
        if (b < f2.y) {
            new_b = f2.b;
            new_y = f2.y - b + y;
        }
        else if (b == f2.y)
        {
            new_b = f2.b;
        }
        else {
            new_b = f2.y - f2.b - b;
        }
        return {new_a , new_b , new_y};
    }

    static function identity(){
        function ret;
        ret = {0,0,0};
        return ret;
    }

} initial[NMAX+1] ;

template<typename data>
struct AINT {
    vector<data> aint;
    int n, offset;
    int nextPowerOf2 (int n)
    {
        int ret = 1;
        while (ret * 2 <= n) ret *= 2;
        return ret;
    }
    AINT (int _n)
    {
        n = _n;
        offset = nextPowerOf2 (n);
        aint.resize(2*offset + 1, data::identity());
        for (int i = offset; i < 2 * offset; i++)
        {
            if (i-offset+1 <= n) {
                aint[i] = initial[i-offset+1];
            }
        }
        for (int i = offset-1; i > 0; i--)
        {
            aint[i] = merge(aint[2*i] , aint[2*i+1]);
        }
    }

    void update (int pos , data f)
    {
        upd (1 , 1 , offset , pos , f);
    }

    int CB (int pos , ll h)
    {
        int nod = pos + offset-1;
        data func = aint[nod];
        if (func.eval(h) == 0) return -1;
        data prev = func;
        while (func.eval(h) > 0)
        {
        //    cout << " " << nod << ' ';
        //    cout << func.eval(h) << '\n';
            prev = func;
            if ((nod & 1) && !(nod & (nod+1))){
                return n;
            }
            else if (nod % 2 == 1)
            {
                nod = nod/2 + 1;
                func = aint[nod].o(func);
            }
            else {
                nod /= 2;
                func = aint[nod];
                prev = data::identity();
            }
        }
        func = prev;
    //    cout << func.a << ' ' << func.b << ' ' << func.y << '\n';
    //    cout << "  " << nod <<'\n'; 
        while (nod < offset)
        {
            data new_func = aint[2 * nod].o(func);
            if (new_func.eval(h) > 0)
            {
                func = new_func;
                nod = 2 * nod + 1;
            }
            else {
                nod = 2 * nod;
            }
        //    cout << nod << '\n';
        }
        return nod-offset;
    }

    
    void upd (int nod , int l , int r , int pos , data f)
    {
        if (l == r)
        {
            if (l == pos) aint[nod] = f;
            return;
        }
        else if (pos < l || r < pos) return;
        int mid = (l + r) / 2;
        upd(2 * nod , l , mid , pos , f);
        upd(2*nod+1, mid+1 , r, pos , f);
        aint[nod] = merge(aint[2*nod] , aint[2*nod+1]);
        return;
    }

    data qry (int nod , int l , int r , int ql , int qr)
    {
        if (qr < l || r < ql) return data::identity();
        else if (l <= ql && r <= qr) return aint[nod];
        int mid = (l + r) / 2;
        return merge (
            qry(2 * nod , l , mid , ql , qr) ,
            qry(2*nod+1, mid+1 , r, ql , qr)
        );
    }

    data merge (data f1 , data f2)
    {
        return f2.o(f1);
    }

    void print ()
    {
        for (int nod = 1; nod < aint.size(); nod++)
        {
            cout << nod << ": " << aint[nod].a << ' ' << aint[nod].b << ' ' << aint[nod].y << '\n';
        }
    }
};

int main ()
{
    int teste; cin >> teste;
    while (teste--) {
        int n, q; cin >> n >> q;
        ll h; cin >> h;
        for (int i = 1; i <= n; i++)
        {
            char c; cin >> c;
            if (c == 'B')
            {
                ll b; cin >> b;
                initial[i] = {b, b, 0};
            }
            else if (c == 'K')
            {
                ll k; cin >> k;
                initial[i] = {k-1 , INF , k};
            }
            else {
                ll c; cin >> c;
                initial[i] = {0, c, c};
            }
        }
        AINT<function> aint(n);

        while (q--)
        {
        //    aint.print();
            char t; cin >> t;
            if (t == 'Z')
            {
                int x;
                char c; cin >> x >>  c;
                if (c == 'B')
                {
                    ll b; cin >> b;
                    aint.update(x, {b, b, 0});
                }
                else if (c == 'K')
                {
                    ll k; cin >> k;
                    aint.update(x, {k-1 , INF , k});
                }
                else {
                    ll c; cin >> c;
                    aint.update(x, {0, c, c});
                }
            }
            else {
                int pos; cin >> pos;
                cout << aint.CB(pos , h) << '\n';
            }
        }
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

input:

1
2000000 4000000 1000000000000
B 2982992025
B 1226542907
B 2299259203
B 1223702056
B 1407121251
B 340783317
B 1259091208
B 2101980047
B 2611543443
B 2010658889
B 4233714406
B 3112120167
B 2311876255
B 2789960428
B 3008572010
B 1
B 2464951378
B 1364240867
B 2829584762
B 2511437438
B 692948679
B 1113...

output:

835343
241687
1021709

result: