제출 #1085155

#제출 시각아이디문제언어결과실행 시간메모리
1085155Wansur코끼리 (Dancing Elephants) (IOI11_elephants)C++17
97 / 100
8156 ms24892 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, ptr = (int)c.size();_>=0;_--){ int i = c[_]; assert(_ == 0 || a[i] >= a[c[_ - 1]]); while(ptr > 0 && a[c[ptr - 1]] > a[i] + l){ ptr--; } if(a[c.back()] > a[i] + l){ out[i] = out[c[ptr]]; dp[i] = dp[c[ptr]] + 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 = 1200; 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 init(int, int, int*)':
elephants.cpp:46:27: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   46 |         if(g[last].size() >= k){
      |            ~~~~~~~~~~~~~~~^~~~
elephants.cpp: In function 'void del(int)':
elephants.cpp:57:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for(int _=0;_<g[block[i]].size();_++){
      |                 ~^~~~~~~~~~~~~~~~~~~
elephants.cpp: In function 'void add(int)':
elephants.cpp:86:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   86 |     if(g[bl].size() > k){
      |        ~~~~~~~~~~~~~^~~
elephants.cpp:88:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   88 |         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...