#include <bits/stdc++.h>
#define REP(i,n) for(int i = 1; i <= (n); i++)
#define int long long
using namespace std;
#ifdef LOCAL
ifstream in("in.in");
ofstream out("out.out");
#else
#define in cin
#define out cout
#endif
///brute
int n,m;
const int nmax = 150005,inf = (1LL<<60);
pair<int,int> queries[nmax];
int a[nmax][3];
set<pair<int,int>> s;
set<int> dis_s[2];
int squared(int x) {
return x * x;
}
int find_distance(int y, int x, int i, int j) {
return squared(y - i) + squared(x - j);
}
int get_dis(int y, int x) {
int val[3] = {inf,inf,inf};///min dis from some other value
for (int k = 1; k <= 2; k++) {
auto after = dis_s[k - 1].lower_bound(y);
auto before = after;
if (before != dis_s[k - 1].begin()) {
before--;
val[k] = min(val[k], find_distance(k , *before , x, y));
}
if (after != dis_s[k - 1].end()) {
val[k] = min(val[k], find_distance(k , *after , x, y));
}
}
return min(val[1] ,val[2]);
}
pair<int,int> sol;
int max_dis = -inf;
void check(int i, int j) {
if ((1 <= i && i <= n && 1 <= j && j <= n) && a[i][j] == 0) {
int dis = get_dis(i,j);
if (dis > max_dis) {
max_dis = dis;
sol = {i,j};
} else if (dis == max_dis && (pair<int,int>{i,j}) < sol) {
sol = {i,j};
}
}
};
void handle(int y1, int y2) {
for (int j = 1; j <= 2; j++) {
check(y1,j);
check(y2,j);
}
/// now check the inbetween spot.
vector<int> mids;
mids.push_back((y1 + y2) / 2);
if ((y1 + y2) %2 == 1) {
mids.push_back((y1 + 2)/2 + 1);
}
for (auto k : mids) {
for (int j = 1; j <= 2; j++) {
check(k,j);
check(k-1,j);
check(k+1,j);
}
}
};
void recalculate(set<pair<int,int>>::iterator it) {
auto nxt = it;
nxt++;
if (nxt != s.end()) {
handle(it->first, nxt->first);
} else {
handle(it->first,n);
}
}
typedef pair<int,pair<int,int>> cool_val;
set<int,cool_val> solutions;
cool_val find_value(set<pair<int,int>>::iterator it) {
max_dis = -inf;
recalculate(it);
return {max_dis, sol};
}
cool_val cool_max(cool_val a, cool_val b) {
if (a.first != b.first) {
return max(a,b);
} else {
return min(a,b);
}
}
pair<int,int> add() {
if (s.empty()) {
return {1,1};
}
cool_val final_val = {-inf,{-inf,-inf}};
for (auto it = s.begin(); it != s.end(); it++) {
final_val = cool_max(final_val , find_value(it));
}
max_dis = -inf;
handle(1 , s.begin()->first);
cool_val first_val = {max_dis, sol};
final_val = cool_max(final_val , first_val);
return final_val.second;
}
pair<int,int> i_to_pair(int i) {
int s = 0;
return {i,a[i][1] + 2 * a[i][2]};
}
int32_t main() {
in >> n >> m;
for (int i = 1; i <= m; i++) {
char type;
in >> type;
if (type == 'E') {
pair<int,int> pos = add();
s.erase(i_to_pair(pos.first));
out << pos.first << " " << pos.second << "\n";
a[pos.first][pos.second] = 1;
dis_s[pos.second - 1].insert(pos.first);
s.insert(i_to_pair(pos.first));
queries[i] = pos;
} else {
int pos;
in >> pos;
int y = queries[pos].first,x = queries[pos].second;
s.erase(i_to_pair(y));
dis_s[queries[pos].second - 1].erase(queries[pos].first);
a[y][x] = 0;
if (a[y][1] == 1 || a[y][2] == 1) {
s.insert(i_to_pair(y));
}
}
}
}
Compilation message
tram.cpp: In function 'std::pair<long long int, long long int> i_to_pair(long long int)':
tram.cpp:130:13: warning: unused variable 's' [-Wunused-variable]
130 | int s = 0;
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
997 ms |
632 KB |
Output is correct |
2 |
Correct |
21 ms |
340 KB |
Output is correct |
3 |
Correct |
166 ms |
388 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
981 ms |
620 KB |
Output is correct |
2 |
Correct |
23 ms |
340 KB |
Output is correct |
3 |
Correct |
176 ms |
516 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1043 ms |
4032 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1032 ms |
4096 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1099 ms |
820 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1060 ms |
4080 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |