QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#575424 | #5710. Solar Flight | zlt | 0 | 4ms | 85828kb | C++14 | 4.8kb | 2024-09-19 14:10:40 | 2024-09-19 14:10:41 |
Judging History
answer
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef __int128 lll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;
bool Mst;
namespace IO {
char ibuf[1 << 20], *iS, *iT, obuf[1 << 20], *oS = obuf;
#define writesp(x) write(x), pc(' ')
#define writeln(x) write(x), pc('\n')
#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, 1 << 20, stdin), (iS == iT ? EOF : *iS++) : *iS++)
template<typename T = int>
inline T read () {
char ch = gh();
T x = 0;
bool t = 0;
while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
return t ? ~(x - 1) : x;
}
inline void flush () {
fwrite(obuf, 1, oS - obuf, stdout), oS = obuf;
}
inline void pc (char ch) {
if (oS == obuf + (1 << 20)) flush();
*oS++ = ch;
}
template<typename T>
inline void write (T x) {
static char stk[64], *tp = stk;
if (x < 0) {
x = ~(x - 1);
pc('-');
}
do {
*tp++ = x % 10;
x /= 10;
} while (x);
while (tp != stk) {
pc((*--tp) | 48);
}
}
}
using IO::read;
using IO::write;
using IO::pc;
using IO::flush;
const int maxn = 2020;
ll n, m, K, id[maxn], a[maxn], b[maxn], c[maxn], d[maxn], p[maxn], q[maxn], h[maxn];
struct frac {
ll x, y;
frac(ll a = 0, ll b = 1) {
if (b < 0) {
a = -a;
b = -b;
}
x = a;
y = b;
}
};
struct node {
frac x;
ll y, z;
} g[maxn];
frac f[maxn][maxn];
bool e[maxn][maxn];
int len[maxn];
inline bool operator < (const frac &a, const frac &b) {
return (lll)a.x * b.y < (lll)a.y * b.x;
}
inline bool operator <= (const frac &a, const frac &b) {
return (lll)a.x * b.y <= (lll)a.y * b.x;
}
inline bool operator == (const frac &a, const frac &b) {
return (lll)a.x * b.y == (lll)a.y * b.x;
}
struct SGT {
ll a[8200];
inline void pushup(int x) {
a[x] = max(a[x << 1], a[x << 1 | 1]);
}
void build(int rt, int l, int r) {
if (l == r) {
a[rt] = h[l];
return;
}
int mid = (l + r) >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
pushup(rt);
}
void query(int rt, int l, int r, int ql, int qr, ll &x) {
if (ql > qr) {
return;
}
if (ql <= l && r <= qr) {
x = max(x, a[rt]);
return;
}
int mid = (l + r) >> 1;
if (ql <= mid) {
query(rt << 1, l, mid, ql, qr, x);
}
if (qr > mid) {
query(rt << 1 | 1, mid + 1, r, ql, qr, x);
}
}
} T[maxn];
inline int find(frac a[maxn], bool b[maxn], int l, int r, ll x) {
int pos = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (((b[mid] && a[mid].x < x * a[mid].y) || (!b[mid] && a[mid].x <= x * a[mid].y))) {
pos = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
assert(pos != -1);
return pos;
}
void solve() {
m = read();
ll X = read();
n = read();
K = read();
map<pii, ll> mp;
map< pii, vector<int> > pm;
for (int i = 1; i <= n; ++i) {
a[i] = read();
b[i] = read();
c[i] = read();
mp[mkp(a[i], b[i])] += c[i];
pm[mkp(a[i], b[i])].pb(i);
}
n = 0;
for (auto p : mp) {
a[++n] = p.fst.fst;
b[n] = p.fst.scd;
c[n] = p.scd;
for (int i : pm[mkp(a[n], b[n])]) {
id[i] = n;
}
}
for (int i = 1; i <= n; ++i) {
p[i] = i;
}
sort(p + 1, p + n + 1, [&](const ll &x, const ll &y) {
return b[x] - a[x] < b[y] - a[y] || (b[x] - a[x] == b[y] - a[y] && a[x] > a[y]);
});
ll s = 0;
for (int i = 1; i <= n; ++i) {
d[p[i]] = s;
s += c[p[i]];
q[p[i]] = i;
}
for (int i = 1; i <= n; ++i) {
int tot = 0;
for (int j = 1; j <= n; ++j) {
if (i == j) {
continue;
}
frac k1(b[i] - a[i], m), k2(b[j] - a[j], m);
if (k1 == k2) {
continue;
}
frac x((a[j] - a[i]) * m, k1.x - k2.x);
g[++tot].x = x;
g[tot].y = (q[i] < q[j] ? c[j] : -c[j]);
g[tot].z = (q[i] < q[j]);
}
sort(g + 1, g + tot + 1, [&](const node &a, const node &b) {
return (lll)a.x.x * b.x.y < (lll)b.x.x * a.x.y;
});
g[0].x = frac(-4e18, 1);
ll s = d[i];
h[0] = s;
for (int j = 1; j <= tot; ++j) {
s += g[j].y;
h[j] = s;
}
T[i].build(1, 0, tot);
len[i] = tot;
for (int j = 0; j <= tot; ++j) {
f[i][j] = g[j].x;
e[i][j] = g[j].z;
}
}
while (K--) {
ll x = read();
ll l = read();
ll r = l + X;
x = id[x];
int L = find(f[x], e[x], 0, len[x], l), R = find(f[x], e[x], 0, len[x], r);
ll ans = -1e18;
T[x].query(1, 0, len[x], L, R, ans);
writeln(ans);
}
}
bool Med;
int main() {
fprintf(stderr, "%.2lf MB\n", (&Mst - &Med) / 1048576.);
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
flush();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 4ms
memory: 85828kb
input:
1000 200 200 1000 657 836 23 962 796 47 497 305 25 837 161 23 220 575 33 697 109 37 401 221 43 883 211 46 727 461 26 681 209 28 413 14 49 664 986 27 431 222 47 307 121 38 638 560 45 801 149 24 878 61 36 761 356 43 839 413 32 931 573 35 218 195 46 201 697 25 951 778 21 705 905 42 861 391 23 582 718 2...
output:
6049 5822 2542 5950 1152 2947 2697 2357 1219 3428 1366 6013 6215 3869 2344 2630 2619 2303 4412 6066 6597 1631 6657 3093 3199 1315 2441 1501 6146 2171 3160 1032 2914 4234 692 5058 3177 3283 5036 1702 3169 1024 6614 1568 5133 2269 4032 877 6458 4609 6270 1564 877 3155 2783 3172 6136 4958 2563 3579 602...
result:
wrong answer 711th lines differ - expected: '3684', found: '3704'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%