Submission #1253527

#TimeUsernameProblemLanguageResultExecution timeMemory
1253527abcdxyz123Triple Peaks (IOI25_triples)C++17
75.12 / 100
217 ms32840 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[5*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; } bool check(int i,int j,int k) { if(1<=i&&i<j&&j<k&&k<=n) { if(h[i]==h[k])return 0; 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]]); } sort(triplet+1,triplet+numTriplet+1); numTriplet=unique(triplet+1,triplet+numTriplet+1)-triplet-1; for(int i=1;i<=n;i++) { sameU[i+h[i]].push_back(i); sameV[i-h[i]+n].push_back(i); } int res=numTriplet; 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; if(1<=i&&i<=n&&i+h[i]==k-h[k]&&i-h[i]==j-h[j]&&h[i]!=h[k])res++; } } else { for(int k:sameV[v]) { int i=j+h[j]+k+h[k]; if(i%2)continue; i/=2; if(1<=i&&i<=n&&i-h[i]==k+h[k]&&i+h[i]==j+h[j]&&h[i]!=h[k])res++; } } } return res; } vector<int> construct_range(int M, int K) { vector<int>id; for(int i=1;i<=M/2;i++)id.push_back(i); for(int i=M/2-1;i>=1;i--)id.push_back(i); id.push_back(2); return id; }
#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...