19832022-12-12 20:22:0512BotiForma-1cpp17Hibás válasz 0/1002.099s8872 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++) {
    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
1Elfogadva4ms1916 KiB
subtask20/20
2Hibás válasz68ms6960 KiB
3Hibás válasz87ms7164 KiB
4Hibás válasz76ms7504 KiB
5Hibás válasz79ms7744 KiB
6Hibás válasz86ms7932 KiB
7Hibás válasz85ms8036 KiB
8Hibás válasz82ms8244 KiB
9Hibás válasz85ms8232 KiB
subtask30/30
10Hibás válasz9ms3788 KiB
11Időlimit túllépés2.099s2656 KiB
12Időlimit túllépés2.073s3148 KiB
13Időlimit túllépés2.062s3352 KiB
14Időlimit túllépés2.029s3584 KiB
15Időlimit túllépés2.062s3432 KiB
16Időlimit túllépés2.053s3492 KiB
17Időlimit túllépés2.065s3512 KiB
18Időlimit túllépés2.058s3492 KiB
subtask40/50
19Hibás válasz75ms8872 KiB
20Időlimit túllépés2.051s5448 KiB
21Időlimit túllépés2.069s5552 KiB
22Időlimit túllépés2.066s5724 KiB
23Időlimit túllépés2.059s5784 KiB
24Időlimit túllépés2.084s5876 KiB
25Időlimit túllépés2.066s5800 KiB
26Időlimit túllépés2.052s5884 KiB
27Időlimit túllépés2.066s5944 KiB
28Időlimit túllépés2.075s6236 KiB
29Időlimit túllépés2.055s6232 KiB
30Időlimit túllépés2.075s6092 KiB