제출 #1254840

#제출 시각아이디문제언어결과실행 시간메모리
1254840ByeWorld3개의 봉우리 (IOI25_triples)C++20
40 / 100
734 ms193016 KiB
#include "triples.h" #include <bits/stdc++.h> #define ll long long #define pb push_back using namespace std; typedef pair<int,int> pii; const int MAXN = 2e5+10; const int SQRT = 500; void chmx(auto &a, auto b){ a = max(a,b); } void chmn(auto &a, auto b){ a = min(a,b); } set<array<int,3>> s; int n, h[MAXN]; ll ans; void cek(int i, int j, int k){ if(s.find({i, j, k}) != s.end()) return; if(1<=i && i<j && j<k && k<=n){ s.insert({i, j, k}); int mxa = -1, mxb = -1, mna = MAXN, mnb = MAXN, tota=0, totb=0; chmx(mxa, h[i]); chmn(mna, h[i]); tota += h[i]; chmx(mxa, h[j]); chmn(mna, h[j]); tota += h[j]; chmx(mxa, h[k]); chmn(mna, h[k]); tota += h[k]; chmx(mxb, j-i); chmn(mnb, j-i); totb += j-i; chmx(mxb, k-j); chmn(mnb, k-j); totb += k-j; chmx(mxb, k-i); chmn(mnb, k-i); totb += k-i; if(mxa==mxb && mna==mnb && tota==totb) ans++; } } vector<int> vec[MAXN<<1], tag[MAXN<<1]; long long count_triples(std::vector<int> H) { n = H.size(); for(int i=1; i<=n; i++) h[i] = H[i-1]; for(int i=1; i<=n; i++){ // i max int k = h[i]+i; cek(i, i+h[k], k); cek(i, k-h[k], k); } for(int k=1; k<=n; k++){ // k max int i = k-h[k]; cek(i, i+h[i], k); cek(i, k-h[i], k); } for(int i=1; i<=n; i++){ // j max int j = i+h[i]; cek(i, j, i+h[j]); } for(int i=1; i<=n; i++) vec[h[i]-i + n].pb(i); for(int idx=0; idx<=2*n; idx++){ // j max if(vec[idx].size() < SQRT){ for(int a=0; a<vec[idx].size(); a++){ for(int b=a+1; b<vec[idx].size(); b++){ int i = vec[idx][a], j = vec[idx][b]; cek(i, j, h[j]+i); } } } else { for(auto i : vec[idx]) tag[h[i]+i].pb(i); for(int k=1; k<=n; k++){ for(auto j : tag[h[k]+k]){ cek(k-h[j], j, k); } } for(auto i : vec[idx]) tag[h[i]+i].clear(); } } return ans; } std::vector<int> construct_range(int M, int K) { return {1, 1, 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...