Submission #1353943

#TimeUsernameProblemLanguageResultExecution timeMemory
1353943toast12Dancing Elephants (IOI11_elephants)C++20
0 / 100
0 ms580 KiB
#include "elephants.h"
#include <bits/stdc++.h>
using namespace std;

int n, l;
int sqrtn;
vector<vector<pair<int, int>>> blocks;
vector<vector<pair<int, int>>> dp;
vector<pair<int, int>> id;
vector<int> a;

void init(int N, int L, int X[]) {
    n = N;
    l = L;
    sqrtn = (int)sqrt(n);
    blocks.resize(sqrtn);
    id.resize(N);
    int temp = 0;
    for (int i = 0; i < n; i += sqrtn, temp++) {
        for (int j = i; j < min(n, i+sqrtn); j++) {
            blocks[temp].push_back({X[j], j});
            id[j] = {temp, j-i};
            a.push_back(X[j]);
        }
    }
    dp.resize(sqrtn);
    for (int i = 0; i < sqrtn; i++) {
        dp[i].resize(blocks[i].size());
        for (int j = blocks[i].size()-1; j >= 0; j--) {
            dp[i][j] = {1, blocks[i][j].first+L};
            auto it = upper_bound(blocks[i].begin(), blocks[i].end(), make_pair(blocks[i][j].first+L, n));
            if (it != blocks[i].end()) {
                int idx = it-blocks[i].begin();
                dp[i][j].first += dp[i][idx].first;
                dp[i][j].second = dp[i][idx].second;
            }
        }
    }
}

int update(int i, int y) {
    int cur = id[i].first, idx = id[i].second;
    int nxt = sqrtn-1;
    for (int j = 0; j < sqrtn; j++) {
        if (blocks[j][0].first >= y) {
            nxt = max(0, j-1);
            break;
        }
    }
    blocks[cur].erase(blocks[cur].begin()+idx);
    for (int j = idx; j < blocks[cur].size(); j++) 
        id[blocks[cur][j].second].second = j;
    blocks[nxt].push_back({y, i});
    sort(blocks[nxt].begin(), blocks[nxt].end());
    id[i].first = nxt;
    for (int j = blocks[nxt].size()-1; j >= 0; j--) {
        if (blocks[nxt][j].first == y) {
            id[i].second = j;
            break;
        }
    }
    for (int j = id[i].second+1; j < blocks[nxt].size(); j++)
        id[blocks[nxt][j].second].second++;
    dp[cur].resize(blocks[cur].size());
    for (int j = blocks[cur].size()-1; j >= 0; j--) {
        dp[cur][j] = {1, blocks[cur][j].first+l};
        auto it = upper_bound(blocks[cur].begin(), blocks[cur].end(), make_pair(blocks[cur][j].first+l, n));
        if (it != blocks[cur].end()) {
            int idx = it-blocks[cur].begin();
            dp[cur][j].first += dp[cur][idx].first;
            dp[cur][j].second = dp[cur][idx].second;
        }
    }
    dp[nxt].resize(blocks[nxt].size());
    for (int j = blocks[nxt].size()-1; j >= 0; j--) {
        dp[nxt][j] = {1, blocks[nxt][j].first+l};
        auto it = upper_bound(blocks[nxt].begin(), blocks[nxt].end(), make_pair(blocks[nxt][j].first+l, n));
        if (it != blocks[nxt].end()) {
            int idx = it-blocks[nxt].begin();
            dp[nxt][j].first += dp[nxt][idx].first;
            dp[nxt][j].second = dp[nxt][idx].second;
        }
    }
    int ans = 0, k = 0;
    for (int j = 0; j < sqrtn;) {
        ans += dp[j][k].first;
        int last = dp[j][k].second;
        j++;
        while (j < sqrtn) {
            auto it = upper_bound(blocks[j].begin(), blocks[j].end(), make_pair(last, n));
            if (it == blocks[j].end()) j++;
            else {
                k = it-blocks[j].begin();
                break;
            }
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...