Submission #1325355

#TimeUsernameProblemLanguageResultExecution timeMemory
1325355Jawad_Akbar_JJ움직이는 개미 (IZhO12_ants)C++20
100 / 100
1 ms336 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1005;
int x[N], y[N], d[N];
vector<int> col[N], row[N];

int get(int c, int dir, int K){
	if (dir == 0)
		return c - 1;
	return 2 * K - 1 - c;
}

pair<int, int> inv(int num, int K){
	if (num < K - 1)
		return {num + 1, 0};
	return {2 * K - 1 - num, 2};
}

void solve(int me, vector<int> &v, int K, int T){
	sort(begin(v), end(v), [] (int a, int b){ return x[a] * N + y[a] < x[b] * N + y[b];});
	vector<pair<int, int>> vec;
	for (int i : v){
		int num = get(x[i] + y[i] - me, d[i] & 2, K);
		num = (num + T) % (2 * K - 2);
		vec.push_back({inv(num, K).first, -num});
	}
	sort(begin(vec), end(vec));

	for (int i=0;i<v.size();i++){
		if (row[me] == v)
			y[v[i]] = vec[i].first;
		else
			x[v[i]] = vec[i].first;
		d[v[i]] = (d[v[i]] & 1) + inv(-vec[i].second, K).second;
	}
}

int main(){
	int n, m, k, T;
	cin>>n>>m>>k>>T;

	for (int i=1;i<=k;i++){
		cin>>x[i]>>y[i]>>d[i], d[i]--, x[i]++, y[i]++;
		if (d[i] & 1)
			row[x[i]].push_back(i);
		else
			col[y[i]].push_back(i);
	}

	for (int i=1;i<N;i++)
		solve(i, row[i], m+1, T);
	for (int i=1;i<N;i++)
		solve(i, col[i], n+1, T);

	for (int i=1;i<=k;i++)
		cout<<x[i] - 1<<" "<<y[i] - 1<<" "<<d[i] + 1<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...