제출 #584457

#제출 시각아이디문제언어결과실행 시간메모리
584457benson1029코끼리 (Dancing Elephants) (IOI11_elephants)C++14
100 / 100
6889 ms24496 KiB
#include "elephants.h" #include<bits/stdc++.h> using namespace std; int n; int RTN; int cntGRP; int l; int a[150005]; int grp[150005]; vector<int> grpv[150005], dis[150005], nxt[150005]; vector< pair<int,int> > v; int round_cnt = 0; void calcgroup(int i) { dis[i].resize(grpv[i].size()); nxt[i].resize(grpv[i].size()); int ptr = grpv[i].size()-1; for(int j=grpv[i].size()-1; j>=0; j--) { while(ptr > 0 && grpv[i][ptr] - grpv[i][j] > l) ptr--; if(ptr == grpv[i].size()-1) { dis[i][j] = 1; nxt[i][j] = grpv[i][j] + l + 1; } else { dis[i][j] = dis[i][ptr+1] + 1; nxt[i][j] = nxt[i][ptr+1]; } } } void build() { v.clear(); for(int i=0; i<n; i++) { v.push_back({a[i], i}); } sort(v.begin(), v.end()); for(int i=0; i<cntGRP; i++) grpv[i].clear(); for(int i=0; i<n; i++) { grp[v[i].second] = i/RTN; grpv[i/RTN].push_back(v[i].first); } for(int i=0; i<cntGRP; i++) { calcgroup(i); } } void init(int N, int L, int X[]) { n = N; l = L; RTN = ceil(sqrt(n)); cntGRP = (N-1) / RTN + 1; for(int i=0; i<n; i++) a[i] = X[i]; build(); } int update(int i, int y) { ++round_cnt; if(round_cnt % RTN == 0) { a[i] = y; build(); } else { int origgrp = 0; while(origgrp < cntGRP-1 && a[i] >= grpv[origgrp+1][0]) origgrp++; int newgrp = 0; while(newgrp < cntGRP-1 && y >= grpv[newgrp+1][0]) newgrp++; for(int j=0; j<grpv[origgrp].size(); j++) { if(grpv[origgrp][j] == a[i]) { for(int k=j+1; k<grpv[origgrp].size(); k++) grpv[origgrp][k-1] = grpv[origgrp][k]; grpv[origgrp].pop_back(); break; } } calcgroup(origgrp); a[i] = y; grpv[newgrp].push_back(y); int ptr = grpv[newgrp].size()-1; while(ptr > 0 && grpv[newgrp][ptr-1] > grpv[newgrp][ptr]) { swap(grpv[newgrp][ptr-1], grpv[newgrp][ptr]); ptr--; } calcgroup(newgrp); } // calculate answer int prevv = -2e9; int ans = 0; for(int i=0; i<cntGRP; i++) { if(grpv[i].size() == 0 || prevv > grpv[i][grpv[i].size()-1]) { continue; } int pos = lower_bound(grpv[i].begin(), grpv[i].end(), prevv) - grpv[i].begin(); ans += dis[i][pos]; prevv = nxt[i][pos]; } return ans; }

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

elephants.cpp: In function 'void calcgroup(int)':
elephants.cpp:21:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |   if(ptr == grpv[i].size()-1) {
      |      ~~~~^~~~~~~~~~~~~~~~~~~
elephants.cpp: In function 'int update(int, int)':
elephants.cpp:69:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |   for(int j=0; j<grpv[origgrp].size(); j++) {
      |                ~^~~~~~~~~~~~~~~~~~~~~
elephants.cpp:71:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |     for(int k=j+1; k<grpv[origgrp].size(); k++) grpv[origgrp][k-1] = grpv[origgrp][k];
      |                    ~^~~~~~~~~~~~~~~~~~~~~
#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...