19792022-12-12 20:02:0412BotiForma-1cpp17Hibás válasz 0/100300ms9348 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
1Elfogadva4ms1912 KiB
subtask20/20
2Hibás válasz71ms6940 KiB
3Futási hiba54ms7104 KiB
4Futási hiba52ms7292 KiB
5Futási hiba52ms7576 KiB
6Futási hiba52ms7784 KiB
7Futási hiba52ms7992 KiB
8Futási hiba52ms8044 KiB
9Futási hiba52ms8240 KiB
subtask30/30
10Hibás válasz12ms3872 KiB
11Futási hiba195ms3736 KiB
12Futási hiba259ms5040 KiB
13Futási hiba226ms5100 KiB
14Futási hiba216ms5312 KiB
15Futási hiba185ms5120 KiB
16Futási hiba130ms5192 KiB
17Futási hiba37ms5436 KiB
18Futási hiba35ms5504 KiB
subtask40/50
19Hibás válasz79ms9120 KiB
20Futási hiba216ms9076 KiB
21Futási hiba300ms9200 KiB
22Futási hiba268ms9192 KiB
23Futási hiba246ms9304 KiB
24Futási hiba223ms9300 KiB
25Futási hiba172ms9300 KiB
26Futási hiba82ms9300 KiB
27Futási hiba75ms9296 KiB
28Futási hiba71ms9296 KiB
29Futási hiba64ms9348 KiB
30Futási hiba61ms9316 KiB