답안 #4552

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
4552 2013-10-27T16:24:45 Z ainta 전차 (CEOI13_tram) C++
10 / 100
54 ms 3960 KB
#include<stdio.h>
#include<algorithm>
#include<set>
#define Set_itr set<int>::iterator
#define SetA_itr set<A>::iterator
using namespace std;
set<int>Set;
Set_itr be, ed;
int n, m, dat[31000];
struct A{
	int d, r, a, b;
	bool operator <(const A &p)const{
		return d != p.d ? d < p.d : r > p.r;
	}
}tp;
set<A>Set2;
int dist(int a, int b){
	int x = a / 2, y = b / 2, r;
	if (x < y)r = y - x;
	else r = x - y;
	r *= 2;
	if (a % 2 != b % 2) r++;
	if (r == 1)r = 2;
	return r;
}
void Print(int a){
	printf("%d %d\n", a / 2 + 1, a % 2 + 1);
}
A Sol(Set_itr it){
	A res;
	Set_itr it2 = it,it3=it,it4;
	int y, my, i, t, R = -1, dis, rr;
	it2++; it4 = it2;
	if (it3 != be)it3--;
	if (it4 != ed)it4++;
	res.a = *it, res.b = *it2;
	y = (res.a / 2 + res.b / 2)/2;
	my = y;
	if ((res.a / 2 + res.b / 2) & 1)my++;
	if (res.b / 2 - res.a / 2 == 2){
		y--, my++;
	}
	while (y <= my){
		for (i = 0; i < 2; i++){
			t = y * 2 + i;
			if (t<res.a || t>res.b)continue;
			dis = min(min(dist(t, *it), dist(t, *it2)), min(dist(t, *it3), dist(t, *it4)));
			if (R < dis)R = dis, rr = t;
		}
		y++;
	}
	res.d = R, res.r = rr;
	return res;
}
void Ins(Set_itr it){
	if (it != ed){
		Set2.insert(Sol(it));
	}
	if (it != be){
		it--;
		Set2.insert(Sol(it));
	}
}
void Put(int cnt, int t){
	dat[cnt] = t;
	Print(t);
	Set_itr it=Set.lower_bound(t);
	if (it != Set.begin() && it != Set.end()){
		it--;
		Set2.erase(Set2.find(Sol(it)));
	}
	Set.insert(t);
	be = Set.begin();
	ed = Set.end();
	ed--;
	Ins(Set.find(t));
}
void insert(int cnt){
	int sz = Set.size(), t, d, r;
	Set_itr it = be, it2;
	t = 1 - (*it % 2);
	if (sz > 1){
		it2 = it; it2++;
		if (*it2 / 2 == *it / 2)t = 0;
	}
	d = dist(t, *it), r = t;
	it = ed;
	t = n * 2 - 1 - (*it % 2);
	if (sz > 1){
		it2 = it; it2--;
		if (*it2 / 2 == *it / 2)t = n * 2 - 2, it = it2;
	}
	if (d < dist(t, *it))d = dist(t, *it), r = t;
	if (Set2.empty()){
		Put(cnt, r);
		return;
	}
	SetA_itr iit;
	if (!Set2.empty()){
		iit = Set2.end(); iit--;
		if (iit->d > d || (d == iit->d &&iit->r < r))d = iit->d, r = iit->r;
	}
	Put(cnt, r);
	return;
}
void del(Set_itr it){
	if (it != ed){
		Set2.erase(Sol(it));
	}
	if (it != be){
		it--;
		Set2.erase(Sol(it));
		it++;
	}
	int t = *it;
	Set.erase(it);
	be = Set.begin();
	ed = Set.end(); ed--;
	Set_itr it2 = Set.lower_bound(t);
	if (it2 != be && it2 != Set.end()){
		it2--;
		Set2.insert(Sol(it2));
	}
}
int main(){
	scanf("%d%d", &n, &m);
	char pp[2];
	int cnt = 0, a;
	while (m--){
		scanf("%s", pp);
		cnt++;
		if (!Set.empty()){
			be = Set.begin();
			ed = Set.end();
			ed--;
		}
		else{
			Put(cnt, 0);
			continue;
		}
		if (pp[0] == 'E'){
			if (cnt == 114){
				cnt = cnt;
			}
			insert(cnt);
		}
		else{
			scanf("%d", &a);
			del(Set.find(dat[a]));
		}
	}
}

Compilation message

tram.cpp: In function 'int main()':
tram.cpp:126:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  126 |  scanf("%d%d", &n, &m);
      |  ~~~~~^~~~~~~~~~~~~~~~
tram.cpp:130:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  130 |   scanf("%s", pp);
      |   ~~~~~^~~~~~~~~~
tram.cpp:148:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  148 |    scanf("%d", &a);
      |    ~~~~~^~~~~~~~~~
tram.cpp: In function 'A Sol(std::set<int>::iterator)':
tram.cpp:53:9: warning: 'rr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   53 |  return res;
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Runtime error 1 ms 364 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 520 KB Output is correct
2 Runtime error 2 ms 492 KB Execution killed with signal 6 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 620 KB Output is correct
2 Runtime error 2 ms 496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 492 KB Output is correct
2 Runtime error 2 ms 492 KB Execution killed with signal 6 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 492 KB Output is correct
2 Runtime error 3 ms 492 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 3820 KB Output is correct
2 Runtime error 7 ms 876 KB Execution killed with signal 6 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 54 ms 3960 KB Output is correct
2 Runtime error 1 ms 364 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -