답안 #225336

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
225336 2020-04-20T09:30:23 Z davitmarg 코끼리 (Dancing Elephants) (IOI11_elephants) C++17
26 / 100
2910 ms 9960 KB
/*DavitMarg*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <iomanip>
#include <bitset>
#include <stack>
#include <cassert>
#include <iterator>
#include <fstream>
#define mod 1000000007ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(), v.end()
using namespace std;
 
 
#ifndef death
#include "elephants.h"
#endif
 
const int N = 150005;
int K;
 
 
int n, len;
vector<pair<int, int>> dp[N], block[N], x;
pair<int, int> pos[N];
 
void build(int i)
{
	dp[i].clear();
	dp[i].resize(block[i].size());
	for (int j = block[i].size() - 1; j >= 0; j--)
	{
		if (block[i].back().first <= block[i][j].first + len)
		{
			dp[i][j] = MP(1, block[i][j].first + len);
			continue;
		}
		int pos = upper_bound(all(block[i]), MP(block[i][j].first + len, n)) - block[i].begin();
		dp[i][j] = MP(dp[i][pos].first + 1, dp[i][pos].second);
	}
}
 
void build()
{
	sort(all(x));
	for (int i = 0; i <= (n - 1) / K; i++)
		block[i].clear();
	for (int i = 0; i < n; i++)
	{
		block[i / K].push_back(x[i]);
		pos[x[i].second] = MP(i / K, i % K);
	}
 
	for (int i = 0; i <= (n - 1) / K; i++)
		build(i);
	sort(all(x), [](pair<int, int> a, pair<int, int> b) {
		return a.second < b.second;
	});
}
 
int get()
{
	int last = -mod;
	int ans = 0;
	for (int i = 0; i <= (n - 1) / K; i++)
	{
		if (block[i].back().first <= last)
			continue;
		int pos = upper_bound(all(block[i]), MP(last, n)) - block[i].begin();
		last = dp[i][pos].second;
		ans += dp[i][pos].first;
	}
	return ans;
}
 
int cnt = -1;
 
int update(int i, int nx)
{
	cnt++;
	if (cnt == 0)
	{
		x[i].first = nx;
		build();
		return get();
	}
 
	int bi = pos[i].first;
 
	swap(block[bi][pos[i].second], block[bi].back());
	block[bi].pop_back();
	sort(all(block[bi]));
	for (int j = 0; j < block[bi].size(); j++)
		pos[block[bi][j].second] = MP(bi, j);
 
	build(bi);
	x[i].first = nx;
 
	bi = 0;
	for (int j = (n - 1) / K; j >= 0; j--)
	{
		if (!block[j].empty() && block[j][0].first <= nx)
		{
			bi = j;
			break;
		}
	}
 
	block[bi].push_back(x[i]);
	sort(all(block[bi]));
	for (int j = 0; j < block[bi].size(); j++)
		pos[block[bi][j].second] = MP(bi, j);
	build(bi);
 
	return get();
}
 
void init(int N, int L, int X[])
{
	n = N;
	len = L;
	K = 500;
	for (int i = 0; i < n; i++)
		x.push_back(MP(X[i], i));
}	
 
#ifdef death
 
int main()
{
	int n,len,x[N],q;
	cin >> n >> len;
	for (int i = 0; i < n; i++)
		cin >> x[i];
	init(n, len, x);
 
	cin >> q;
	while (q--)
	{
		int i, pos;
		cin >> i >> pos;
		cout << update(i, pos) << endl;
	}
 
	return 0;
}
 
#endif
 
/*
 
4 10 
10 15 17 20
5
2 16
1 25
3 35
0 38
2 0
 
 
4 5
10 15 20 25
100
0 10
2 12
3 25
 
 
 
 
*/

Compilation message

elephants.cpp: In function 'int update(int, int)':
elephants.cpp:108:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int j = 0; j < block[bi].size(); j++)
                  ~~^~~~~~~~~~~~~~~~~~
elephants.cpp:126:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int j = 0; j < block[bi].size(); j++)
                  ~~^~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 7424 KB Output is correct
2 Correct 8 ms 7424 KB Output is correct
3 Correct 8 ms 7424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 7424 KB Output is correct
2 Correct 8 ms 7424 KB Output is correct
3 Correct 8 ms 7424 KB Output is correct
4 Correct 9 ms 7424 KB Output is correct
5 Correct 9 ms 7424 KB Output is correct
6 Correct 8 ms 7424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 7424 KB Output is correct
2 Correct 8 ms 7424 KB Output is correct
3 Correct 8 ms 7424 KB Output is correct
4 Correct 9 ms 7424 KB Output is correct
5 Correct 9 ms 7424 KB Output is correct
6 Correct 8 ms 7424 KB Output is correct
7 Correct 2825 ms 8508 KB Output is correct
8 Correct 2910 ms 8696 KB Output is correct
9 Correct 2902 ms 9960 KB Output is correct
10 Incorrect 66 ms 9840 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 7424 KB Output is correct
2 Correct 8 ms 7424 KB Output is correct
3 Correct 8 ms 7424 KB Output is correct
4 Correct 9 ms 7424 KB Output is correct
5 Correct 9 ms 7424 KB Output is correct
6 Correct 8 ms 7424 KB Output is correct
7 Correct 2825 ms 8508 KB Output is correct
8 Correct 2910 ms 8696 KB Output is correct
9 Correct 2902 ms 9960 KB Output is correct
10 Incorrect 66 ms 9840 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 7424 KB Output is correct
2 Correct 8 ms 7424 KB Output is correct
3 Correct 8 ms 7424 KB Output is correct
4 Correct 9 ms 7424 KB Output is correct
5 Correct 9 ms 7424 KB Output is correct
6 Correct 8 ms 7424 KB Output is correct
7 Correct 2825 ms 8508 KB Output is correct
8 Correct 2910 ms 8696 KB Output is correct
9 Correct 2902 ms 9960 KB Output is correct
10 Incorrect 66 ms 9840 KB Output isn't correct
11 Halted 0 ms 0 KB -