제출 #584446

#제출 시각아이디문제언어결과실행 시간메모리
584446benson1029코끼리 (Dancing Elephants) (IOI11_elephants)C++14
26 / 100
9100 ms12720 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 + RTN - 1) / RTN;
	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 || true) {
		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...