제출 #1085151

#제출 시각아이디문제언어결과실행 시간메모리
1085151Wansur코끼리 (Dancing Elephants) (IOI11_elephants)C++17
97 / 100
9045 ms21520 KiB
#include <bits/stdc++.h> #define ent '\n' using namespace std; const int maxn = 2e5 + 12; set<pair<int, int>> s, t; vector<int> g[maxn]; int a[maxn], block[maxn]; int out[maxn], dp[maxn]; int n, k, l, last; void calc(vector<int> &c){ for(int _=(int)c.size()-1;_>=0;_--){ int i = c[_]; assert(_ == 0 || a[i] >= a[c[_ - 1]]); if(a[c.back()] > a[i] + l){ int pos = 0; for(int L = 0, R = (int)c.size() - 1; L <= R;){ int mid = L + R >> 1; if(a[c[mid]] > a[i] + l){ pos = mid; R = mid - 1; } else L = mid + 1; } out[i] = out[c[pos]]; dp[i] = dp[c[pos]] + 1; } else{ out[i] = a[i] + l; dp[i] = 1; } assert(out[i] >= a[i] + l); } } void init(int N, int L, int X[]){ n = N, l = L; k = 1000; for(int i=0;i<n;i++){ a[i] = X[i]; } sort(a, a+n); for(int i=0;i<n;i++){ if(!g[last].size()){ t.insert({a[i], last}); } block[i] = last; g[last].push_back(i); s.insert({a[i], i}); if(g[last].size() >= k){ last++; } } for(int i=0;i<=last;i++){ calc(g[i]); } } void del(int i){ int pos = -1; for(int _=0;_<g[block[i]].size();_++){ if(g[block[i]][_] == i){ pos = _; } } if(pos < 0) exit(0); g[block[i]].erase(g[block[i]].begin() + pos); calc(g[block[i]]); s.erase({a[i], i}); } void add(int i){ auto it = t.lower_bound({a[i] + 1, 0}); int bl = 0; if(it == t.begin()){ auto [x, y] = *it; t.erase(it); t.insert({a[i], y}); bl = y; } else{ it--; bl = it -> second; } block[i] = bl; g[bl].push_back(i); sort(g[bl].begin(), g[bl].end(), [](int i, int j){ return a[i] < a[j]; }); if(g[bl].size() > k){ last++; while(g[bl].size() > k / 2){ g[last].push_back(g[bl].back()); block[g[bl].back()] = last; g[bl].pop_back(); } reverse(g[last].begin(), g[last].end()); t.insert({a[g[last][0]], last}); calc(g[last]); } calc(g[bl]); s.insert({a[i], i}); } int get(){ int val = -1, ans = 0; while(1){ auto it = s.lower_bound({val + 1, 0}); if(it == s.end()) break; auto [x, y] = *it; ans += dp[y]; val = out[y]; } return ans; } int update(int i, int y){ del(i); a[i] = y; add(i); return get(); }

컴파일 시 표준 에러 (stderr) 메시지

elephants.cpp: In function 'void calc(std::vector<int>&)':
elephants.cpp:20:29: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   20 |                 int mid = L + R >> 1;
      |                           ~~^~~
elephants.cpp: In function 'void init(int, int, int*)':
elephants.cpp:52:27: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   52 |         if(g[last].size() >= k){
      |            ~~~~~~~~~~~~~~~^~~~
elephants.cpp: In function 'void del(int)':
elephants.cpp:63:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for(int _=0;_<g[block[i]].size();_++){
      |                 ~^~~~~~~~~~~~~~~~~~~
elephants.cpp: In function 'void add(int)':
elephants.cpp:92:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   92 |     if(g[bl].size() > k){
      |        ~~~~~~~~~~~~~^~~
elephants.cpp:94:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   94 |         while(g[bl].size() > k / 2){
      |               ~~~~~~~~~~~~~^~~~~~~
#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...