제출 #1261560

#제출 시각아이디문제언어결과실행 시간메모리
1261560am_aadvik3개의 봉우리 (IOI25_triples)C++20
38.05 / 100
2052 ms102668 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

void check(int i, int j, int k, vector<int>&a  \
	, set<pair<pair<int, int>, int>> &s) {
	vector<int> x = { j - i, k - i, k - j };
	vector<int> y = { a[i], a[j], a[k] };
	sort(x.begin(), x.end());
	sort(y.begin(), y.end());
	for (int i = 0; i < 3; ++i)
		if (x[i] != y[i]) return;
	s.insert({ {i, j }, k});
}
void findi(int j, int k, vector<int>&a  \
	, set<pair<pair<int, int>, int>> &ms) {
	if ((k < 0) || ((k >= a.size()))) return;
	if ((j < 0) || ((j >= a.size()))) return;
	vector<int> op = { j - a[j],
		k - a[k], j - a[k], k - a[j] };
	set<int> s;
	for (auto x : op) s.insert(x);
	for (auto i : s)
		if ((i >= 0) && (i < a.size()))
			if ((k + a[k]) == (j + a[j]))
				check(i, j, k, a, ms);
}
void findk(int i, int j, vector<int>& a  \
	, set<pair<pair<int, int>, int>> &ms) {
	if ((j < 0) || ((j >= a.size()))) return;
	if ((i < 0) || ((i >= a.size()))) return;
	vector<int> op = { i + a[i],
		j + a[i], i + a[j], j + a[j] };
	set<int> s;
	for (auto x : op) s.insert(x);
	for (auto k : s)
		if ((k >= 0) && (k < a.size()))
			if ((k + a[k]) == (j + a[j]))
				check(i, j, k, a, ms);
}
long long count_triples(vector<int> a) {
	set<pair<pair<int, int>, int>> ans;
	long long n = a.size();
	for (int x = 0; x < n; ++x)
		for (auto y : { x - a[x], x + a[x]})
			if (!((y < 0) || ((y >= a.size())))) {
				set<int> s; 
				for (auto v : { x - a[x], x + a[x], y + a[y], y - a[y],
					y + a[x], y - a[x], x + a[y], x - a[y] }) s.insert(v);
				for (auto z : s) {
					if ((z < 0) || ((z >= a.size()))) continue;
					vector<int> op = { x, y, z }; sort(op.begin(), op.end());
					check(op[0], op[1], op[2], a, ans);
				}
			}
	vector<vector<int>> x(n + n), y(n + n);
	for (int i = 0; i < n; ++i)
		x[a[i] - i + n].push_back(i);
	for (int i = 0; i < n; ++i)
		y[a[i] + i].push_back(i);
	for (int j = 0; j < n; ++j) {
		if (x[a[j] - j + n].size() < y[a[j] + j].size())
			for (auto i : x[a[j] - j + n])
				findk(i, j, a, ans);
		else 
			for (auto k : y[a[j] + j])
				findi(j, k, a, ans);
	}
	return (int)ans.size();
}
vector<int> construct_range(int M, int K) {
	vector<int> a = { 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; return a;
}
//int main() { cout << count_triples({ 4, 1, 4, 3, 2, 6, 1 }); }
#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...
#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...