1982 2022. 12. 12 20:10:16 12Boti Forma-1 cpp17 Hibás válasz 0/100 2.099s 9700 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;
    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++) {
    for (int i = 0; i < N; i++) {
      int j = place[i];
      ull v = (ull)eqs[j].a * T * T + (ull)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++) {
      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';
  }
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 4ms 1912 KiB
subtask2 0/20
2 Hibás válasz 68ms 6944 KiB
3 Hibás válasz 104ms 7288 KiB
4 Hibás válasz 82ms 7468 KiB
5 Hibás válasz 90ms 7692 KiB
6 Hibás válasz 104ms 7896 KiB
7 Hibás válasz 100ms 7996 KiB
8 Hibás válasz 97ms 8188 KiB
9 Hibás válasz 100ms 8328 KiB
subtask3 0/30
10 Hibás válasz 10ms 4268 KiB
11 Időlimit túllépés 2.099s 3036 KiB
12 Időlimit túllépés 2.061s 3632 KiB
13 Időlimit túllépés 2.062s 3924 KiB
14 Időlimit túllépés 2.062s 3740 KiB
15 Időlimit túllépés 2.046s 3804 KiB
16 Időlimit túllépés 2.061s 3808 KiB
17 Időlimit túllépés 2.063s 3808 KiB
18 Időlimit túllépés 2.082s 4064 KiB
subtask4 0/50
19 Hibás válasz 76ms 9264 KiB
20 Időlimit túllépés 2.042s 5944 KiB
21 Időlimit túllépés 2.071s 6136 KiB
22 Időlimit túllépés 2.066s 6280 KiB
23 Időlimit túllépés 2.062s 6420 KiB
24 Időlimit túllépés 2.078s 6500 KiB
25 Időlimit túllépés 2.059s 6524 KiB
26 Időlimit túllépés 2.051s 6520 KiB
27 Időlimit túllépés 2.039s 6604 KiB
28 Időlimit túllépés 2.03s 6416 KiB
29 Időlimit túllépés 2.039s 6436 KiB
30 Időlimit túllépés 2.098s 9700 KiB