Submission #1294517

#TimeUsernameProblemLanguageResultExecution timeMemory
1294517SugarCubes69Triple Peaks (IOI25_triples)C++20
75.29 / 100
137 ms37144 KiB
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
const ll maxn = 200005;


map<ll,vector<ll>> b;
long long count_triples(std::vector<int> a) {
    ll ans = 0;
    ll N = a.size();

    // i,k,j
    for(int i=0;i<N;i++){
        ll j = i+a[i];
        if(j>=N || a[j]>=a[i]) continue;
        ll k = j-a[j];
        ans += (a[k]+a[j]==a[i]);

        //equidistant
        if(2*a[j]==a[i]) continue;
        k = i+a[j];
        ans += (a[k]+a[j]==a[i]);
    }
    for(int j=0;j<N;j++){
        ll i = j-a[j];
        if(i<0 || a[i]>=a[j]) continue;
        ll k = i+a[i];
        ans += (a[k]+a[i]==a[j]);

        //equidistant
        if(2*a[i]==a[j]) continue;
        k = j-a[i];
        ans += (a[k]+a[i]==a[j]);
    }

    for(int i=0;i<N;i++){
        ll j = i+a[i];
        if(j>=N || a[j]<=a[i]) continue;
        ll k = i+a[j];
        if(k>=N || a[k]==a[i]) continue;
        ans += (a[k]+a[i]==a[j]);
    }

    //h[i] = k-j
    //h[k] = j-i
    //h[j] = k-i

    //h[i]-h[j] = i-j
    //h[i]-i = h[j]-j

    //h[k]+h[j] = j+k
    //h[k]-k = h[j]-j
    for(int i=0;i<N;i++) b[a[i]-i].push_back(i);
    ll cutoff = sqrt(N);
    for(pair<ll,vector<ll>> itr:b){
        ll x = itr.first;
        vector<ll> vec = itr.second;
        if(vec.size()<=cutoff){
            for(int i:vec) for(int j:vec){
                if(i==j) continue;
                ll k = i+a[j];
                if(j<k && k<N){
                    ans += (a[i]==k-j && a[j]==(k-i) && a[k]==(i-j));
                }
            }
        }
        else{
            for(int k=0;k<N;k++){
                //k-x = h[k]+2i
                ll lhs = k-x;
                ll rhs = a[k];//2i
                if(lhs%2==rhs%2){
                    ll i = (lhs-rhs)/2;
                    ll j = (lhs+rhs)/2;
                    ans += (0<=i && i<N && 0<=j && j<N && a[i]-i==x && a[j]-j==x);
                }

            }
        }
    }


    return ans;
}
std::vector<int> construct_range(int M, int K) {
    vector<int> res; res.push_back(1);
    for (int i = 1; i < M; i ++) res.push_back(i);
    return res;
}


/*void run_part1() {
  int N;
  assert(1 == scanf("%d", &N));
  std::vector<int> H(N);
  for (int i = 0; i < N; i++)
    assert(1 == scanf("%d", &H[i]));
  fclose(stdin);

  long long T = count_triples(H);

  printf("%lld\n", T);
  fclose(stdout);
}

void run_part2() {
  int M, K;
  assert(2 == scanf("%d %d", &M, &K));
  fclose(stdin);

  std::vector<int> H = construct_range(M, K);

  int N = H.size();
  printf("%d\n", N);
  for (int i = 0; i < N; i++)
    printf("%d%c", H[i], " \n"[i + 1 == N]);
  fclose(stdout);
}


int main() {
  int part;
  assert(1 == scanf("%d", &part));
  if (part == 1)
    run_part1();
  else if (part == 2)
    run_part2();

  return 0;
}*/
#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...