Submission #199276

# Submission time Handle Problem Language Result Execution time Memory
199276 2020-01-30T22:18:45 Z godwind Dancing Elephants (IOI11_elephants) C++14
10 / 100
8 ms 3960 KB
// O O O O O O O O O O O O O O O OO O OO O OO O O O TTCH O TTTCH O TTTCH O O O O
#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx")
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <stdio.h>
#include <cstdio>
#include <math.h>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <deque>
#include <random>
#include <iomanip>
#include <bitset>
#include <cassert>
 
// #include "grader.h"

using namespace std;


#define y1 y11
#define double long double
#define less less228
#define left left228
#define right right228
#define list list228

template<typename T> void uin(T &a, T b) {
    if (b < a) a = b;
}
template<typename T> void uax(T &a, T b) {
    if (b > a) a = b;
}

const int N = 150 * 1000 + 228;
const int K = 10;

int n, L;
int x[N], num[N];
int max_block;
vector<int> b[N];
int jump[N], right[N];

void build(int block) {
	int sz = (int)b[block].size();
	for (int i = sz - 1; i + 1; --i) {
		int l = i, r = sz;
		while (r - l > 1) {
			int m = (l + r) >> 1;
			if (x[b[block][m]] <= x[b[block][i]] + L) {
				l = m;
			} else {
				r = m;
			}
		}
		jump[b[block][i]] = sz - 1;
		if (l == sz - 1) {
			right[b[block][i]] = x[b[block][i]] + L;
			jump[b[block][i]] = 1;
		} else {
			right[b[block][i]] = right[b[block][l + 1]];
			jump[b[block][i]] = jump[b[block][l + 1]] + 1;
		}
	}
}

void rebuild() {
	vector<int> indices;
	for (int i = 0; i <= max_block; ++i) {
		for (int j : b[i]) {
			indices.emplace_back(j);
		}
		b[i].clear();
	}
	for (int i = 0; i < n; ++i) {
		b[i / K].push_back(indices[i]);
	}
	for (int i = 0; i <= max_block; ++i) {
		build(i);
	}
}

int get_answer() {
	int block = 0;
	while (b[block].empty()) ++block;
	int ind = 0;
	int answer = 0;
	while (1) {
		int i = b[block][ind];
		answer += jump[i];
		if (block == max_block) break;
		bool caught = 0;
		for (int bl =
		 block + 1; bl <= max_block; ++bl) {
			if (b[bl].empty()) continue;
			if (x[b[bl].back()] <= right[i]) continue;
			caught = 1;
			int l = -1, r = (int)b[bl].size() - 1;
			while (r - l > 1) {
				int m = (l + r) >> 1;
				if (x[b[bl][m]] <= right[i]) {
					l = m;
				} else {
					r = m;
				}
			}
			block = bl;
			ind = r;
			break;
		}
		if (!caught) break;
	}
	return answer;
}

int update(int id, int nv) {
	for (int i = 0; i < (int)b[num[id]].size(); ++i) {
		if (b[num[id]][i] == id) {
			b[num[id]].erase(b[num[id]].begin() + i);
		}
	}
	build(num[id]);
	x[id] = nv;
	int block = 0;
	for (int i = 0; i <= max_block; ++i) {
		if (x[b[i][0]] <= x[id]) block = i;
	}
	b[block].push_back(id);
	num[id] = block;
	int pos = (int)b[block].size() - 1;
	while (pos && x[b[block][pos]] < x[b[block][pos - 1]]) {
		swap(b[block][pos], b[block][pos - 1]);
		--pos;
	}
	if (b[block].size() > 2 * K) {
		rebuild();
	} else {
		build(block);
	}
	// cout << "id=" << id << " nv=" << nv << endl;
	// for (int i = 0; i <= max_block; ++i) {
	// 	cout << "b[" << i << "] :\n";
	// 	for (int j : b[i]) {
	// 		cout << "(" << j << ", x=" << x[j] << ", jump=" << jump[j] << " right=" << right[j] << ")\n";
	// 	}
	// }
	return get_answer();
}

void init(int nnnn, int llll, int xs[]) {
	n = nnnn;
	L = llll;
	for (int i = 0; i < n; ++i) {
		x[i] = xs[i];
		b[i / K].push_back(i);
		num[i] = i / K;
	}
	max_block = (n - 1) / K;
	for (int i = 0; i <= max_block; ++i) {
		build(i);
	}
    return;
}

// int xx[100];

// signed main() {
// 	int q;
// 	cin >> n >> L >> q;
// 	for (int i = 0; i < n; ++i) {
// 		cin >> xx[i];
// 	}
// 	init(n, L, xx);
// 	while(q--) {
// 		int i, j;
// 		cin >> i >> j;
// 		cout << update(i, j) << '\n';
// 	}
// 	return 0;
// }





# Verdict Execution time Memory Grader output
1 Correct 7 ms 3832 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 8 ms 3960 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 3832 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 8 ms 3960 KB Output is correct
4 Incorrect 8 ms 3832 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 3832 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 8 ms 3960 KB Output is correct
4 Incorrect 8 ms 3832 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 3832 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 8 ms 3960 KB Output is correct
4 Incorrect 8 ms 3832 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 3832 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 8 ms 3960 KB Output is correct
4 Incorrect 8 ms 3832 KB Output isn't correct
5 Halted 0 ms 0 KB -