Submission #1253472

#TimeUsernameProblemLanguageResultExecution timeMemory
1253472abcdxyz123Triple Peaks (IOI25_triples)C++17
70 / 100
1887 ms121508 KiB
#include "triples.h" #include<bits/stdc++.h> using namespace std; #define maxn 200005 #define ll long long #define pi pair<int,int> #define pii pair<pi,int> #define all(x) x.begin(),x.end() int n; int h[maxn]; vector<int>sameU[2*maxn]; vector<int>sameV[2*maxn]; int numTriplet; ll triplet[100*maxn]; ll mask(int i,int j,int k) { return 1LL*i*(n+1)*(n+1)+1LL*j*(n+1)+k; } bool isValid(int i,int j,int k) { if(1<=i&&i<j&&j<k&&k<=n) { vector<int>A={h[i],h[j],h[k]}; vector<int>B={j-i,k-j,k-i}; sort(all(A)); sort(all(B)); if(A==B) { triplet[++numTriplet]=mask(i,j,k); return 1; } } return 0; } void brute() { int res=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { for(int k=j+1;k<=n;k++) { res+=isValid(i,j,k); } } } cout<<"Brute:"<<res<<'\n'; } ll count_triples(vector<int> H) { n=H.size(); for(int i=0;i<n;i++)h[i+1]=H[i]; //brute(); numTriplet=0; for(int j=1;j<=n;j++) { if(j-h[j]>=1)isValid(j-h[j],j,j-h[j]+h[j-h[j]]); if(j+h[j]<=n)isValid(j-h[j+h[j]],j,j+h[j]); if(j+h[j]<=n)isValid(j+h[j]-h[j+h[j]],j,j+h[j]); if(j-h[j]>=1)isValid(j-h[j],j,j+h[j-h[j]]); } for(int i=1;i<=n;i++) { if(i+h[i]<=n)isValid(i,i+h[i],i+h[i+h[i]]); } for(int i=1;i<=n;i++) { sameU[i+h[i]].push_back(i); sameV[i-h[i]+n].push_back(i); } for(int j=1;j<=n;j++) { int u=j+h[j]; int v=j-h[j]+n; if(sameU[u].size()<sameV[v].size()) { for(int k:sameU[u]) { int i=j-h[j]+k-h[k]; if(i%2)continue; i/=2; isValid(i,j,k); isValid(k,j,i); } } else { for(int k:sameV[v]) { int i=j+h[j]+k+h[k]; if(i%2)continue; i/=2; isValid(i,j,k); isValid(k,j,i); } } } sort(triplet+1,triplet+numTriplet+1); numTriplet=unique(triplet+1,triplet+numTriplet+1)-triplet-1; return numTriplet; } 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...