Submission #1257517

#TimeUsernameProblemLanguageResultExecution timeMemory
1257517medmdgTriple Peaks (IOI25_triples)C++20
0 / 100
2107 ms362068 KiB
#include "triples.h" #include <bits/stdc++.h> typedef long long ll; using namespace std; vector<int> H; ll n; bool check(ll i,ll j,ll k){ if(i<0||j<0||k<0||i>=n||j>=n||k>=n)return 0; ll s1[3],s2[3]; s1[0]=(abs(j-i)); s1[1]=(abs(k-i)); s1[2]=(abs(j-k)); sort(s1,s1+3); if(s1[0]==0)return 0; s2[0]=(H[i]); s2[1]=(H[j]); s2[2]=(H[k]); sort(s2,s2+3); return s1[0]==s2[0]&&s1[1]==s2[1]&&s1[2]==s2[2]; } ll sub4(){ ll ans=0; for(int i=n-1;i>1;i--){ ll x2=i-H[i]; if(x2<0)continue; ll x3=x2+H[x2],x4=i-H[x2]; if(x3<i && i-x3==H[x3])ans++; if(x3!=x4) if(x4>x2 && x4-x2==H[x4])ans++; } return ans; } ll sub2(){ ll ans=0; for(int i=0;i<n;i++){ for(int j=i+1;j<=i+20;j++){ for(int k=j+1;k<n&&k<i+20;k++){ ans+=check(i,j,k); } } } return ans; } ll sub3(){ ll ans=0; for(ll i=0;i<n;i++){ //Check M a b while(1){ ll x2=i+H[i]; if(x2>=n)break; ll x3=x2-H[x2],x4=i+H[x2]; if(x3>i && x3-i==H[x3])ans++; if(x3!=x4) if(x4<x2 && x2-x4==H[x4])ans++; break; } //check a b M while(1){ ll x2=i-H[i]; if(x2<0)break; ll x3=x2+H[x2],x4=i-H[x2]; if(x3<i && i-x3==H[x3])ans++; if(x3!=x4) if(x4>x2 && x4-x2==H[x4])ans++; break; } //check a M b ll l=max(0LL,i-H[i]+1); ll r=min(i,n-H[i]); for(int j=l;j<r;j++){ ll x3=j+H[i]; if(H[j]==i-j&&H[x3]==x3-i)ans++; else if(H[x3]==i-j&&H[j]==x3-i)ans++; } } return ans; } ll full(){ ll ans=0; ll typ=sqrt(n); ll ntype=450; vector<vector<int>> a(n+1,vector<int>(ntype,n)); vector<int> type(n); for(int i=n-1;i>=0;i--){ if(i!=n-1){ for(int j=0;j<ntype;j++){ a[i][j]=a[i+1][j]; } } type[i]=H[i]/typ; a[i][type[i]]=i; } for(ll i=0;i<n;i++){ //Check M a b while(1){ ll x2=i+H[i]; if(x2>=n)break; ll x3=x2-H[x2],x4=i+H[x2]; if(x3>i && x3-i==H[x3])ans++; if(x3!=x4) if(x4<x2 && x2-x4==H[x4])ans++; break; } //check a b M while(1){ ll x2=i-H[i]; if(x2<0)break; ll x3=x2+H[x2],x4=i-H[x2]; if(x3<i && i-x3==H[x3])ans++; if(x3!=x4) if(x4>x2 && x4-x2==H[x4])ans++; break; } //check a M b ll l=max(0LL,i-H[i]+1); ll r=min(i,n-H[i]); /*for(int j=l;j<r;j++){ ll x3=j+H[i],dt=i-j,dt2=x3-i; if(H[j]==dt&&H[x3]==dt2)ans++; else if(H[x3]==dt&&H[j]==dt2)ans++; }*/ /// check o M o for(int j=0;j<ntype;j++){ ll mir=i-typ*(j+1),mar=i-typ*j; mir=max(mir,l); mar=min(mar,r); mir=a[mir][j]; while(mir<mar){ ll x3=mir+H[i],dt=i-mir,dt2=x3-i; if(H[mir]==dt&&H[x3]==dt2)ans++; mir=a[mir+1][j]; } } ///check x M x for(int j=0;j<ntype;j++){ ll mir=i+typ*j-H[i],mar=i+typ*(j+1)-H[i]; mar=min(mar,r); mir=min(mir,mar); mir=max(mir,l); mir=a[mir][j]; while(mir<mar){ ll x3=mir+H[i],dt=i-mir,dt2=x3-i; if(dt!=dt2) if(H[x3]==dt&&H[mir]==dt2)ans++; mir=a[mir+1][j]; } } } return ans; } ll count_triples(vector<int> h) { n=h.size(); H=h; return full(); } 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...