Submission #529388

#TimeUsernameProblemLanguageResultExecution timeMemory
529388flappybirdDancing Elephants (IOI11_elephants)C++14
100 / 100
8087 ms35920 KiB
#include "elephants.h" #include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx,avx2,fma") using namespace std; typedef long long ll; typedef pair<int, int> pi; #define MAX 150010 #define INF 1000000010 #define B 300 int N; int L; int arr[MAX]; int cnt; map<int, int> ncnt; int gcnt; set<int> allv; vector<pair<int, pi>> bukkit[MAX]; inline bool cmpp(const pair<int, pi>& p1, const pair<int, pi>& p2) { return p1.first < p2.first; } //refresh bukkit void refb(int b) { if (bukkit[b].empty()) return; while (bukkit[b].size() && bukkit[b].back().first == INF) bukkit[b].pop_back(); int i; int ub = bukkit[b].size(); for (i = bukkit[b].size() - 1; i >= 0; i--) { int x = bukkit[b][i].first; int e = x + L; while (ub && bukkit[b][ub - 1].first > e) ub--; if (ub == bukkit[b].size()) bukkit[b][i].second = pi(1, e); else bukkit[b][i].second = pi(bukkit[b][ub].second.first + 1, bukkit[b][ub].second.second); } } void ref() { for (int i = 0; i < gcnt; i++) bukkit[i].clear(); gcnt = 0; for (auto v : allv) { if (bukkit[gcnt].size() == B) gcnt++; bukkit[gcnt].push_back(make_pair(v, pi(0, 0))); } gcnt++; for (int i = 0; i < gcnt; i++) refb(i); } int calc() { int en = -2, i; int cnt = 0; for (i = 0; i < gcnt; i++) { if (bukkit[i].empty()) continue; auto ub = lower_bound(bukkit[i].begin(), bukkit[i].end(), make_pair(en + 1, pi(0, 0)), cmpp) - bukkit[i].begin(); if (ub == bukkit[i].size()) continue; cnt += bukkit[i][ub].second.first; en = bukkit[i][ub].second.second; } return cnt; } void init(int N, int L, int X[]) { ::N = N; ::L = L; int i; for (i = 0; i < N; i++) arr[i] = X[i], allv.insert(arr[i]), ncnt[arr[i]]++; ref(); } int update(int i, int y) { cnt++; if (cnt == B) ref(), cnt = 0; int x = arr[i]; arr[i] = y; ncnt[x]--; if (ncnt[x] == 0) { int i, ind = 0; for (i = 0; i < gcnt; i++) if (bukkit[i].size() && bukkit[i].begin()->first <= x) ind = i; int it = lower_bound(bukkit[ind].begin(), bukkit[ind].end(), make_pair(x, pi(0, 0)), cmpp) - bukkit[ind].begin(); bukkit[ind].erase(bukkit[ind].begin() + it); allv.erase(x); refb(ind); } if (ncnt[y] == 0) { allv.insert(y); int i, ind = 0; for (i = 0; i < gcnt; i++) if (bukkit[i].size() && bukkit[i].begin()->first <= y) ind = i; int nind; nind = lower_bound(bukkit[ind].begin(), bukkit[ind].end(), make_pair(y, pi(0, 0))) - bukkit[ind].begin(); bukkit[ind].insert(bukkit[ind].begin() + nind, make_pair(y, pi(0, 0))); allv.insert(y); refb(ind); } ncnt[y]++; return calc(); }

Compilation message (stderr)

elephants.cpp: In function 'void refb(int)':
elephants.cpp:38:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |   if (ub == bukkit[b].size()) bukkit[b][i].second = pi(1, e);
      |       ~~~^~~~~~~~~~~~~~~~~~~
elephants.cpp: In function 'int calc()':
elephants.cpp:60:10: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |   if (ub == bukkit[i].size()) continue;
      |       ~~~^~~~~~~~~~~~~~~~~~~
#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...