제출 #1137707

#제출 시각아이디문제언어결과실행 시간메모리
1137707AbdullahIshfaqNaval battle (CEOI24_battle)C++20
76 / 100
1686 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MOD 1000000007
ll n, mxx = 0, mxy = 0;

vector<ll> ids, xs, ys, dxs, dys, done;
vector<char> dir;
ll tim(ll i, ll j) {
    ll t = (abs(xs[j] - xs[i]) + abs(ys[j] - ys[i])) / 2;
    if (xs[j] + t * dxs[j] == xs[i] + t * dxs[i] and ys[j] + t * dys[j] == ys[i] + t * dys[i]) {
        return t;
    } else {
        return 1e9;
    }
}
bool valid(ll ind) {
    return (0 <= xs[ind] and xs[ind] <= mxx) and (0 <= ys[ind] and ys[ind] <= mxy);
}
void solve(){
	bool flg = 1;
	cin >> n;
    for (int i = 0; i < n; i++) {
        ll x, y;
        char d;
        cin >> x >> y >> d;
        mxx = max(mxx, x);
        mxy = max(mxy, y);
        ids.push_back(i);
		xs.push_back(x);
		ys.push_back(y);
		if(d == 'W' or d == 'N'){
			flg = 0;
		}
		else{
			dir.push_back(d);
		}
		dxs.push_back(d == 'W' ? -1 : (d == 'E' ? 1 : 0));
		dys.push_back(d == 'N' ? -1 : (d == 'S' ? 1 : 0));
		done.push_back(1e9);
    }
	if(flg){
		unordered_map<int, vector<int>> diags;
		for (int i = 0; i < n; i++) {
			int diag = xs[i] + ys[i];
			if (diags.count(diag) == 0) {
				diags[diag] = {};
			}
			diags[diag].push_back(i);
		}
		for (auto& [diag, shp] : diags) {
			sort(shp.begin(), shp.end(),[&](auto i, auto j){return xs[i] <= xs[j];});
			vector<int> st;
			for (int i : shp) {
				if (st.size() == 0 || !(dir[st.back()] == 'E' && dir[i] == 'S')) {
					st.push_back(i);
				} else {
					st.pop_back();
				}
			}
			for (int i : st) {
				cout << ids[i] + 1 << endl;
			}
		}
		return ;
	}
    vector<tuple<ll, ll, ll>> happ;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            ll tt = tim(i, j);
            if (tt < 1e9) {
                happ.emplace_back(tt, i, j);
            }
        }
    }
    sort(happ.begin(), happ.end());
    for (auto [time, i, j] : happ) {
        if (done[i] < time or done[j] < time)
            continue;
        done[i] = done[j] = time;
    }
    for (int i = 0; i < n; i++) {
        if (done[i] == 1e9) {
            cout << ids[i] + 1 << '\n';
        }
    }
}
int main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int tests = 1;
	// cin >> tests;
	for (int i = 1; i <= tests; i++) {
		solve();
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...