Submission #1254844

#TimeUsernameProblemLanguageResultExecution timeMemory
1254844ByeWorldTriple Peaks (IOI25_triples)C++20
0 / 100
36 ms33208 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 = 5e5+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); }

int n, h[MAXN];
ll ans;
void cek(int i, int j, int k){
	if(1<=i && i<j && j<k && k<=n){
		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], tag[MAXN];
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];
		if(h[i] != i+h[j]-j) 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...