19782022-12-12 19:50:1212BotiForma-1cpp17Hibás válasz 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';
  }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva4ms1920 KiB
subtask20/20
2Hibás válasz68ms6948 KiB
3Hibás válasz97ms7144 KiB
4Hibás válasz79ms7356 KiB
5Hibás válasz83ms7780 KiB
6Hibás válasz97ms7896 KiB
7Hibás válasz93ms7884 KiB
8Hibás válasz90ms8028 KiB
9Hibás válasz93ms8228 KiB
subtask30/30
10Hibás válasz12ms4044 KiB
11Időlimit túllépés2.098s3236 KiB
12Időlimit túllépés2.065s3804 KiB
13Időlimit túllépés2.078s3612 KiB
14Időlimit túllépés2.062s3820 KiB
15Időlimit túllépés2.065s3944 KiB
16Időlimit túllépés2.029s3684 KiB
17Időlimit túllépés2.078s4016 KiB
18Időlimit túllépés2.062s3836 KiB
subtask40/50
19Hibás válasz78ms8864 KiB
20Időlimit túllépés2.066s5604 KiB
21Időlimit túllépés2.055s5644 KiB
22Időlimit túllépés2.059s5688 KiB
23Időlimit túllépés2.038s5720 KiB
24Időlimit túllépés2.042s5952 KiB
25Időlimit túllépés2.082s6120 KiB
26Időlimit túllépés2.069s6176 KiB
27Időlimit túllépés2.055s6036 KiB
28Időlimit túllépés2.066s6116 KiB
29Időlimit túllépés2.078s6244 KiB
30Időlimit túllépés2.059s6080 KiB