Submission #1253721

#TimeUsernameProblemLanguageResultExecution timeMemory
1253721TheScrasseTriple Peaks (IOI25_triples)C++20
42.45 / 100
475 ms493856 KiB
#include <bits/stdc++.h> using namespace std; #define nl "\n" #define nf endl #define ll long long #define pb push_back #define _ << ' ' << #define INF (ll)1e18 #define mod 998244353 #define maxn 50010 #include "triples.h" long long count_triples(std::vector<int> H) { // subtask 5 ll n = H.size(); vector<array<ll, 3>> triples; auto match = [&](ll i, ll j, ll k) { // cout << "match" _ i _ j _ k << nf; if (-1 >= i || i >= j || j >= k || k >= n) return; if (H[i] == k - j && H[j] == k - i && H[k] == j - i) return; array<ll, 3> a = {j - i, k - j, k - i}; array<ll, 3> b = {H[i], H[j], H[k]}; sort(a.begin(), a.end()); sort(b.begin(), b.end()); if (a == b) triples.pb({i, j, k}); }; // H[k] = k - i for (ll k = 0; k < n; k++) { ll i = k - H[k]; if (i < 0) continue; ll hj = 2 * k - 2 * i - H[i] - H[k]; { ll j = k - hj; match(i, j, k); } { ll j = i + hj; match(i, j, k); } } // H[k] = k - j for (ll k = 0; k < n; k++) { ll j = k - H[k]; if (j < 0) continue; { ll i = k - H[j]; match(i, j, k); } { ll i = j - H[j]; match(i, j, k); } } // H[k] = j - i, H[i] = k - i map<ll, vector<ll>> by_k; for (ll i = 0; i < n; i++) by_k[H[i] + i].pb(i); for (ll k = 0; k < n; k++) { for (auto i : by_k[k]) { ll j = i + H[k]; match(i, j, k); } } sort(triples.begin(), triples.end()); triples.resize(unique(triples.begin(), triples.end()) - triples.begin()); ll ans = triples.size(); // bad case map<ll, bitset<maxn>> im, ip; for (ll i = 0; i < n; i++) { ip[i + H[i]][i] = 1; } for (ll j = 0; j < n; j++) { ip[j + H[j]][j] = 0; auto bt = im[j - H[j]] & (ip[j + H[j]] >> H[j]); ans += bt.count(); /* for (ll i = 0; i < 20; i++) cout << bt[i]; cout << nl; */ im[j - H[j]][j] = 1; } return ans; } std::vector<int> construct_range(int M, int K) { vector<ll> v = {3, 1, 2, 1, 4, 3, 2, 3, 1, 5, 1, 3, 2, 3, 4, 1, 2, 1, 3}; vector<int> ans; for (ll i = 0; i < M; i++) ans.pb(v[i % v.size()]); return ans; }
#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...