19812022-12-12 20:07:0612BotiForma-1cpp17Hibás válasz 0/1002.099s9448 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 = 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';
  }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva4ms2068 KiB
subtask20/20
2Hibás válasz68ms7060 KiB
3Hibás válasz89ms7208 KiB
4Hibás válasz76ms7396 KiB
5Hibás válasz82ms7520 KiB
6Hibás válasz90ms7720 KiB
7Hibás válasz86ms7920 KiB
8Hibás válasz86ms7924 KiB
9Hibás válasz87ms7996 KiB
subtask30/30
10Hibás válasz12ms3552 KiB
11Időlimit túllépés2.099s2676 KiB
12Időlimit túllépés2.036s3368 KiB
13Időlimit túllépés2.056s3560 KiB
14Időlimit túllépés2.073s3876 KiB
15Időlimit túllépés2.078s4204 KiB
16Időlimit túllépés2.078s4152 KiB
17Időlimit túllépés2.081s4336 KiB
18Időlimit túllépés2.069s4116 KiB
subtask40/50
19Hibás válasz76ms9448 KiB
20Időlimit túllépés2.068s6184 KiB
21Időlimit túllépés2.062s6240 KiB
22Időlimit túllépés2.075s6208 KiB
23Időlimit túllépés2.075s6392 KiB
24Időlimit túllépés2.082s6348 KiB
25Időlimit túllépés2.062s6604 KiB
26Időlimit túllépés2.062s6584 KiB
27Időlimit túllépés2.066s6568 KiB
28Időlimit túllépés2.082s6544 KiB
29Időlimit túllépés2.058s6532 KiB
30Időlimit túllépés2.061s6668 KiB