Submission #97789

#TimeUsernameProblemLanguageResultExecution timeMemory
97789Alexa2001Bubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
3010 ms46628 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>

#define mid ((st+dr)>>1)
#define left_son (node<<1)
#define right_son ((node<<1)|1)

using namespace std;

const int Nmax = 1e6 + 5, lim = 1e6, inf = 1e6;
typedef long long ll;

ll a[Nmax], val[Nmax];

class SegmentTree
{
    int lazy[Nmax<<2], a[Nmax<<2];

public:
    void add(int node, int st, int dr, int L, int R, int Add)
    {
        if(L <= st && dr <= R)
        {
            lazy[node] += Add;
            return;
        }

        if(L <= mid) add(left_son, st, mid, L, R, Add);
        if(mid < R) add(right_son, mid+1, dr, L, R, Add);

        a[node] = max(a[left_son] + lazy[left_son], a[right_son] + lazy[right_son]);
    }
    int query()
    {
        return a[1] + lazy[1];
    }
    void init(int node, int st, int dr)
    {
        a[node] = -inf; lazy[node] = 0;
        if(st == dr) return;
        init(left_son, st, mid); init(right_son, mid+1, dr);
    }

} aint;

int Search(vector<ll> &a, ll val)
{
    int st = 0, dr = a.size() - 1;
    while(st <= dr)
        if(a[mid] < val) st = mid+1;
            else dr = mid-1;
    return st + 1;
}

vector<int> countScans(vector<int> A, vector<int> X, vector<int> V)
{
    int N = A.size(), i;
    int Q = V.size();

    for(i=0; i<N; ++i) a[i] = (ll) lim * A[i] + i;
    for(i=0; i<Q; ++i) val[i] = (ll) lim * V[i] + X[i];

    vector<ll> vals;
    for(i=0; i<N; ++i) vals.push_back(a[i]);
    for(i=0; i<Q; ++i) vals.push_back(val[i]);
    sort(vals.begin(), vals.end());

    int cnt = vals.size();
    aint.init(1, 1, cnt);

    for(i=0; i<N; ++i)
    {
        int pos = Search(vals, (a[i]));
        aint.add(1, 1, cnt, pos, pos, +inf+i);
        aint.add(1, 1, cnt, 1, pos, +1);
    }

    vector<int> answer(Q);
    for(i=0; i<Q; ++i)
    {
        int pos = Search(vals, a[X[i]]);
        aint.add(1, 1, cnt, 1, pos, -1);
        aint.add(1, 1, cnt, pos, pos, -inf-X[i]);

        a[X[i]] = val[i];
        int act = Search(vals, val[i]);
        aint.add(1, 1, cnt, act, act, +inf+X[i]);
        aint.add(1, 1, cnt, 1, act, 1);

        answer[i] = aint.query() - N;
    }
    return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...