Submission #59087

# Submission time Handle Problem Language Result Execution time Memory
59087 2018-07-20T13:36:25 Z fallingstar Dancing Elephants (IOI11_elephants) C++14
97 / 100
9000 ms 14104 KB
#include "elephants.h"
#include <list>
#include <vector>

using namespace std;

const int N = 1.5e5;

int n, L;

struct TElephant { 
	int id, x;
	int f, xDest;
	inline bool operator < (const TElephant &b) const 
	{
		return x < b.x || (x == b.x && id < b.id);			// if x equals, compare by id
	}
}; 

list<list<TElephant> > a;
int pos[N];

const int BLOCK_SIZE = 800;

void Calc(list<TElephant> &seg)
{
	auto itR = prev(seg.end()), itL = itR;
	itL->f = 0, itL->xDest = itL->x;
	while (itL != seg.begin())
	{
		--itL;
		while (itR != itL && itL->x + L < prev(itR)->x) itR = prev(itR);
		if (itL->x + L < itR->x)
		{
			itL->f = itR->f + 1;
			itL->xDest = itR->xDest;
		}
		else 
			itL->f = 0, itL->xDest = itL->x;
	}
}

void Rebuild()
{
	vector<pair<int, int> > arr;
	for (const auto &seg: a)
		for (const auto &e: seg)
			arr.push_back({e.id, e.x});
	
	a.clear();
	list<TElephant> cur;
	for (int i = 0; i < n; ++i)
	{
		cur.push_back({arr[i].first, arr[i].second, 0, arr[i].second});
		if (cur.size() >= BLOCK_SIZE || i == n - 1) 
		{
			Calc(cur);
			a.push_back(move(cur));
			cur.clear();
		}
	}
}

void init(int numElephants, int camWidth, int X[])
{
	n = numElephants;
	L = camWidth;
	list<TElephant> sentinel;
	for (int i = 0; i < n; ++i) 
	{
		pos[i] = X[i];
		sentinel.push_back({i, X[i], 0, 0});
	}
	a.push_back(move(sentinel));
	Rebuild();
}

const int STACK_SIZE = 800;
int countQuery = 0;

int GetAns() 
{
	int ans = 0, curX = a.begin()->begin()->x;
	for (auto i = a.begin(); i != a.end(); ++i)
		if (prev(i->end())->x >= curX)					// if segment contain current X
		{
			for (auto it = i->begin(); it != i->end(); ++it)
				if (it->x >= curX)
				{
					ans += it->f + 1;					// jump inner-segment, then to new segment
					curX = it->xDest + L + 1;
					break;
				}
		}
	return ans;
}

int update(int idx, int y)
{
	int x = pos[idx];
	TElephant old_ele {idx, x, 0, 0};
	TElephant new_ele {idx, y, 0, 0};
	
	// erase idx from old position
	for (auto i = a.begin(); i != a.end(); ++i)
		if (!(i->back() < old_ele))					// i->back >= old_ele
		{
			list<TElephant> leftSeg;
			for (auto it = i->begin(); it != i->end(); ++it)
				if (it->id == idx)
				{
					// cut segment into 2 parts
					leftSeg.splice(leftSeg.end(), *i, i->begin(), next(it));
					break;
				}
			if (i->empty()) i = a.erase(i);
			leftSeg.pop_back();
			if (!leftSeg.empty()) 
			{
				Calc(leftSeg);
				a.insert(i, move(leftSeg));
			}
			break;
		}
	
	// insert idx to new position
	if (a.empty()) 
		a.push_back(list<TElephant>(1, new_ele)); 
	else if (a.back().back() < new_ele)
	{
		a.back().push_back(new_ele);
		Calc(a.back());
	}	
	else 
		for (auto i = a.begin(); i != a.end(); ++i)
			if (new_ele < i->back())
			{
				for (auto it = i->begin(); it != i->end(); ++it)
					if (new_ele < *it)
					{
						i->insert(it, new_ele);
						break;
					}
				Calc(*i);
				break;
			}
	
	pos[idx] = y;
	++countQuery;
	if (countQuery >= STACK_SIZE) Rebuild(), countQuery = 0;
	return GetAns();
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
3 Correct 2 ms 488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
3 Correct 2 ms 488 KB Output is correct
4 Correct 4 ms 488 KB Output is correct
5 Correct 2 ms 488 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
3 Correct 2 ms 488 KB Output is correct
4 Correct 4 ms 488 KB Output is correct
5 Correct 2 ms 488 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
7 Correct 596 ms 2080 KB Output is correct
8 Correct 573 ms 2636 KB Output is correct
9 Correct 870 ms 5152 KB Output is correct
10 Correct 780 ms 5152 KB Output is correct
11 Correct 2413 ms 5152 KB Output is correct
12 Correct 1594 ms 5152 KB Output is correct
13 Correct 1241 ms 5152 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
3 Correct 2 ms 488 KB Output is correct
4 Correct 4 ms 488 KB Output is correct
5 Correct 2 ms 488 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
7 Correct 596 ms 2080 KB Output is correct
8 Correct 573 ms 2636 KB Output is correct
9 Correct 870 ms 5152 KB Output is correct
10 Correct 780 ms 5152 KB Output is correct
11 Correct 2413 ms 5152 KB Output is correct
12 Correct 1594 ms 5152 KB Output is correct
13 Correct 1241 ms 5152 KB Output is correct
14 Correct 1465 ms 5152 KB Output is correct
15 Correct 844 ms 5152 KB Output is correct
16 Correct 2366 ms 5364 KB Output is correct
17 Correct 3370 ms 7184 KB Output is correct
18 Correct 3037 ms 7184 KB Output is correct
19 Correct 1405 ms 7184 KB Output is correct
20 Correct 3094 ms 7184 KB Output is correct
21 Correct 2798 ms 7184 KB Output is correct
22 Correct 2349 ms 7184 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
3 Correct 2 ms 488 KB Output is correct
4 Correct 4 ms 488 KB Output is correct
5 Correct 2 ms 488 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
7 Correct 596 ms 2080 KB Output is correct
8 Correct 573 ms 2636 KB Output is correct
9 Correct 870 ms 5152 KB Output is correct
10 Correct 780 ms 5152 KB Output is correct
11 Correct 2413 ms 5152 KB Output is correct
12 Correct 1594 ms 5152 KB Output is correct
13 Correct 1241 ms 5152 KB Output is correct
14 Correct 1465 ms 5152 KB Output is correct
15 Correct 844 ms 5152 KB Output is correct
16 Correct 2366 ms 5364 KB Output is correct
17 Correct 3370 ms 7184 KB Output is correct
18 Correct 3037 ms 7184 KB Output is correct
19 Correct 1405 ms 7184 KB Output is correct
20 Correct 3094 ms 7184 KB Output is correct
21 Correct 2798 ms 7184 KB Output is correct
22 Correct 2349 ms 7184 KB Output is correct
23 Execution timed out 9015 ms 14104 KB Time limit exceeded
24 Halted 0 ms 0 KB -