19822022-12-12 20:10:1612BotiForma-1cpp17Hibás válasz 0/1002.099s9700 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva4ms1912 KiB
subtask20/20
2Hibás válasz68ms6944 KiB
3Hibás válasz104ms7288 KiB
4Hibás válasz82ms7468 KiB
5Hibás válasz90ms7692 KiB
6Hibás válasz104ms7896 KiB
7Hibás válasz100ms7996 KiB
8Hibás válasz97ms8188 KiB
9Hibás válasz100ms8328 KiB
subtask30/30
10Hibás válasz10ms4268 KiB
11Időlimit túllépés2.099s3036 KiB
12Időlimit túllépés2.061s3632 KiB
13Időlimit túllépés2.062s3924 KiB
14Időlimit túllépés2.062s3740 KiB
15Időlimit túllépés2.046s3804 KiB
16Időlimit túllépés2.061s3808 KiB
17Időlimit túllépés2.063s3808 KiB
18Időlimit túllépés2.082s4064 KiB
subtask40/50
19Hibás válasz76ms9264 KiB
20Időlimit túllépés2.042s5944 KiB
21Időlimit túllépés2.071s6136 KiB
22Időlimit túllépés2.066s6280 KiB
23Időlimit túllépés2.062s6420 KiB
24Időlimit túllépés2.078s6500 KiB
25Időlimit túllépés2.059s6524 KiB
26Időlimit túllépés2.051s6520 KiB
27Időlimit túllépés2.039s6604 KiB
28Időlimit túllépés2.03s6416 KiB
29Időlimit túllépés2.039s6436 KiB
30Időlimit túllépés2.098s9700 KiB