Submission #199296

# Submission time Handle Problem Language Result Execution time Memory
199296 2020-01-30T22:46:41 Z godwind Dancing Elephants (IOI11_elephants) C++17
97 / 100
9000 ms 9336 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 = 200;

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]);
        num[indices[i]] = i / K;
	}
	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 (!b[i].empty() && 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() > 3 * 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 9 ms 3960 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 7 ms 3936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 3960 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 7 ms 3936 KB Output is correct
4 Correct 8 ms 3832 KB Output is correct
5 Correct 9 ms 3960 KB Output is correct
6 Correct 8 ms 3832 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 3960 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 7 ms 3936 KB Output is correct
4 Correct 8 ms 3832 KB Output is correct
5 Correct 9 ms 3960 KB Output is correct
6 Correct 8 ms 3832 KB Output is correct
7 Correct 967 ms 4960 KB Output is correct
8 Correct 1190 ms 4948 KB Output is correct
9 Correct 1762 ms 5764 KB Output is correct
10 Correct 2193 ms 6368 KB Output is correct
11 Correct 1793 ms 6388 KB Output is correct
12 Correct 2364 ms 6328 KB Output is correct
13 Correct 2678 ms 6492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 3960 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 7 ms 3936 KB Output is correct
4 Correct 8 ms 3832 KB Output is correct
5 Correct 9 ms 3960 KB Output is correct
6 Correct 8 ms 3832 KB Output is correct
7 Correct 967 ms 4960 KB Output is correct
8 Correct 1190 ms 4948 KB Output is correct
9 Correct 1762 ms 5764 KB Output is correct
10 Correct 2193 ms 6368 KB Output is correct
11 Correct 1793 ms 6388 KB Output is correct
12 Correct 2364 ms 6328 KB Output is correct
13 Correct 2678 ms 6492 KB Output is correct
14 Correct 1728 ms 5656 KB Output is correct
15 Correct 1988 ms 5240 KB Output is correct
16 Correct 2946 ms 6128 KB Output is correct
17 Correct 3888 ms 7292 KB Output is correct
18 Correct 4046 ms 7312 KB Output is correct
19 Correct 4554 ms 7512 KB Output is correct
20 Correct 3889 ms 7276 KB Output is correct
21 Correct 3998 ms 7380 KB Output is correct
22 Correct 4003 ms 7524 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 3960 KB Output is correct
2 Correct 7 ms 3832 KB Output is correct
3 Correct 7 ms 3936 KB Output is correct
4 Correct 8 ms 3832 KB Output is correct
5 Correct 9 ms 3960 KB Output is correct
6 Correct 8 ms 3832 KB Output is correct
7 Correct 967 ms 4960 KB Output is correct
8 Correct 1190 ms 4948 KB Output is correct
9 Correct 1762 ms 5764 KB Output is correct
10 Correct 2193 ms 6368 KB Output is correct
11 Correct 1793 ms 6388 KB Output is correct
12 Correct 2364 ms 6328 KB Output is correct
13 Correct 2678 ms 6492 KB Output is correct
14 Correct 1728 ms 5656 KB Output is correct
15 Correct 1988 ms 5240 KB Output is correct
16 Correct 2946 ms 6128 KB Output is correct
17 Correct 3888 ms 7292 KB Output is correct
18 Correct 4046 ms 7312 KB Output is correct
19 Correct 4554 ms 7512 KB Output is correct
20 Correct 3889 ms 7276 KB Output is correct
21 Correct 3998 ms 7380 KB Output is correct
22 Correct 4003 ms 7524 KB Output is correct
23 Execution timed out 9082 ms 9336 KB Time limit exceeded
24 Halted 0 ms 0 KB -