19782022-12-12 19:50:1212BotiForma-1cpp17Wrong answer 0/1002.098s8864 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 positionA[N_MAX];
ull *position = positionA;
ull velocityA[N_MAX];
ull *velocity = velocityA;

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;
    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; });

  // 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++) {
    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++) {
      position[place[i]] += velocity[place[i]];
      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
1Accepted4ms1920 KiB
subtask20/20
2Wrong answer68ms6948 KiB
3Wrong answer97ms7144 KiB
4Wrong answer79ms7356 KiB
5Wrong answer83ms7780 KiB
6Wrong answer97ms7896 KiB
7Wrong answer93ms7884 KiB
8Wrong answer90ms8028 KiB
9Wrong answer93ms8228 KiB
subtask30/30
10Wrong answer12ms4044 KiB
11Time limit exceeded2.098s3236 KiB
12Time limit exceeded2.065s3804 KiB
13Time limit exceeded2.078s3612 KiB
14Time limit exceeded2.062s3820 KiB
15Time limit exceeded2.065s3944 KiB
16Time limit exceeded2.029s3684 KiB
17Time limit exceeded2.078s4016 KiB
18Time limit exceeded2.062s3836 KiB
subtask40/50
19Wrong answer78ms8864 KiB
20Time limit exceeded2.066s5604 KiB
21Time limit exceeded2.055s5644 KiB
22Time limit exceeded2.059s5688 KiB
23Time limit exceeded2.038s5720 KiB
24Time limit exceeded2.042s5952 KiB
25Time limit exceeded2.082s6120 KiB
26Time limit exceeded2.069s6176 KiB
27Time limit exceeded2.055s6036 KiB
28Time limit exceeded2.066s6116 KiB
29Time limit exceeded2.078s6244 KiB
30Time limit exceeded2.059s6080 KiB