19802022-12-12 20:05:4512BotiForma-1cpp17Wrong answer 0/1002.098s8948 KiB
#include <algorithm>
#include <iostream>
#include <math.h>

using namespace std;
typedef unsigned long long ull;

#define N_MAX 2000
#define Q_MAX 200000
#define T_MAX 1000000

struct Eq {
  int a, b, c, idx;
};

struct Question {
  int P, T, idx;
};

int N, Q;
Eq eqs[N_MAX];
Question qus[Q_MAX];
int ans[Q_MAX];
int placeA[N_MAX];
int *place = placeA;
ull position[N_MAX];
ull velocity[N_MAX];

bool cmp(int a, int b) {
  if (position[a] > position[b])
    return true;
  if (position[a] < position[b])
    return false;
  if (eqs[a].idx < eqs[b].idx)
    return true;
  return false;
}

int main() {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(false);
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> eqs[i].a >> eqs[i].b >> eqs[i].c;
    if (eqs[i].a > T_MAX || eqs[i].b > T_MAX || eqs[i].c > T_MAX) {
      return 1;
    }
    eqs[i].idx = i + 1;
  }
  cin >> Q;
  for (int i = 0; i < Q; i++) {
    cin >> qus[i].P >> qus[i].T;
    qus[i].P--;
    qus[i].idx = i;
  }
  sort(qus, qus + Q,
       [](const Question &a, const Question &b) { return a.T < b.T; });

  if (N > N_MAX || Q > Q_MAX || qus[Q - 1].T > T_MAX) {
    return 1;
  }

  // a(x+1)^2+b(x+1)+c - (ax^2+bx+c)
  // = 2ax+a+b
  // 2a(x+1)+a+b - (2ax+a+b)
  // = 2a
  for (int i = 0; i < N; i++) {
    place[i] = i;
    position[i] = eqs[i].c;
    velocity[i] = eqs[i].a + eqs[i].b;
  }
  int qi = 0;
  int placeoff = 0;
  for (int T = 0; T <= T_MAX; T++) {
    // for (int i = 0; i < N; i++) {
    //   int j = place[i];
    //   ull v = eqs[j].a * T * T + eqs[j].b * T + eqs[j].c;
    //   if (v != position[j]) {
    //     return 1;
    //   }
    // }

    if (qus[qi].T == T) {
      sort(place, place + N, cmp);
      while (N > 0) {
        for (int i = 1; i < N; i++) {
          if (velocity[place[0]] < velocity[place[i]] ||
              eqs[place[0]].a < eqs[place[i]].a) {
            goto nope1;
          }
        }
        // cout << T << " <+\n";
        place++;
        N--;
        placeoff++;
      }
    nope1:
      while (N > 0) {
        for (int i = 0; i < N - 1; i++) {
          if (velocity[place[N - 1]] > velocity[place[i]] ||
              eqs[place[N - 1]].a > eqs[place[i]].a) {
            goto nope2;
          }
        }
        // cout << T << " <-\n";
        N--;
      }
    nope2:
      ans[qus[qi].idx] = eqs[place[qus[qi].P - placeoff]].idx;
      qi++;
      // if (qi == Q)
      //   break;
    }

    ull minpos = ~(ull)0;
    for (int i = 0; i < N; i++) {
      // ull oldpos = position[place[i]];
      position[place[i]] += velocity[place[i]];
      // if (position[place[i]] < oldpos) {
      //   return 1;
      // }
      velocity[place[i]] += 2 * eqs[place[i]].a;
      if (position[place[i]] > minpos) {
        minpos = position[place[i]];
      }
    }
    // for (int i = 0; i < N; i++) {
    //   position[place[i]] -= minpos;
    // }
  }

  for (int i = 0; i < Q; i++) {
    cout << ans[i] << '\n';
  }
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted4ms1916 KiB
subtask20/20
2Wrong answer68ms6944 KiB
3Wrong answer87ms7156 KiB
4Wrong answer76ms7356 KiB
5Wrong answer79ms7576 KiB
6Wrong answer86ms7568 KiB
7Wrong answer86ms7752 KiB
8Wrong answer82ms7972 KiB
9Wrong answer85ms8152 KiB
subtask30/30
10Wrong answer10ms3820 KiB
11Time limit exceeded2.098s2716 KiB
12Time limit exceeded2.053s3252 KiB
13Time limit exceeded2.033s3188 KiB
14Time limit exceeded2.042s3224 KiB
15Time limit exceeded2.062s3520 KiB
16Time limit exceeded2.065s3728 KiB
17Time limit exceeded2.073s3632 KiB
18Time limit exceeded2.062s3896 KiB
subtask40/50
19Wrong answer76ms8948 KiB
20Time limit exceeded2.071s5636 KiB
21Time limit exceeded2.078s5716 KiB
22Time limit exceeded2.051s5728 KiB
23Time limit exceeded2.066s5664 KiB
24Time limit exceeded2.055s5732 KiB
25Time limit exceeded2.059s5808 KiB
26Time limit exceeded2.078s5912 KiB
27Time limit exceeded2.071s5936 KiB
28Time limit exceeded2.066s5868 KiB
29Time limit exceeded2.073s6032 KiB
30Time limit exceeded2.078s6140 KiB