QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#178897 | #2342. Directing Rainfall | PetroTarnavskyi | WA | 680ms | 68796kb | C++17 | 3.7kb | 2023-09-14 15:05:41 | 2023-09-14 15:05:42 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, b, a) for(int i = (b) - 1; i >= (a); i--)
#define SZ(a) (int)a.size()
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
const int N = 1 << 22;
const int INF = 1.1e9;
struct SegTree
{
int t[2 * N], lazy[2 * N];
void build(int v, int tl, int tr, int l, int r)
{
if(tl + 1 == tr)
{
if(l <= tl && tr <= r)
t[v] = 0;
else
t[v] = INF;
return;
}
int tm = (tl + tr) / 2;
build(2 * v, tl, tm, l, r);
build(2 * v + 1, tm, tr, l, r);
t[v] = min(t[2 * v], t[2 * v + 1]);
}
void push(int v, int tl, int tr)
{
t[v] = min(INF, t[v] + lazy[v]);
if(tl + 1 != tr)
{
lazy[2 * v] += lazy[v];
lazy[2 * v + 1] += lazy[v];
}
lazy[v] = 0;
}
void add(int v, int tl, int tr, int l, int r) //add 1 on seg
{
push(v, tl, tr);
if(tr <= l || r <= tl)
return;
if(l <= tl && tr <= r)
{
lazy[v]++;
push(v, tl, tr);
return;
}
int tm = (tl + tr) / 2;
add(2 * v, tl, tm, l, r);
add(2 * v + 1, tm, tr, l, r);
t[v] = min(t[2 * v], t[2 * v + 1]);
}
void upd(int v, int tl, int tr, int pos, int val)
{
push(v, tl, tr);
if(pos < tl || tr <= pos)
return;
if(tl + 1 == tr)
{
t[v] = min(t[v], val);
return;
}
int tm = (tl + tr) / 2;
upd(2 * v, tl, tm, pos, val);
upd(2 * v + 1, tm, tr, pos, val);
t[v] = min(t[2 * v], t[2 * v + 1]);
}
int query(int v, int tl, int tr, int l, int r)
{
push(v, tl, tr);
if(tr <= l || r <= tl)
return INF;
if(l <= tl && tr <= r)
{
return t[v];
}
int tm = (tl + tr) / 2;
return min(query(2 * v, tl, tm, l, r),
query(2 * v + 1, tm, tr, l, r));
}
}T;
LL globalX;
struct Line
{
LL A, B, C;//Ax + By + C = 0
int index;
Line(){}
Line(LL y, int i) : A(0), B(1), C(-y), index(i) {}
Line(LL x0, LL y0, LL x1, LL y1, int i) : index(i)
{
A = y1 - y0;
B = x0 - x1;
C = -x0 * A - y0 * B;
assert(B != 0);
if(B < 0)
{
A *= -1;
B *= -1;
C *= -1;
}
}
bool operator<(const Line& L) const
{
//return (-C - A * globalX) * L.B < (-L.C - L.A * globalX) * B;
return (-C - A * globalX) * (__int128)L.B < (-L.C - L.A * globalX) * (__int128)B;
}
}lines[N];
LL x[2][N], y[2][N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(15);
int l, r, n;
cin >> l >> r >> n;
VI xs = {l, r};
FOR(i, 0, n)
{
FOR(t, 0, 2)
cin >> x[t][i] >> y[t][i];
if(x[0][i] > x[1][i])
{
swap(x[0][i], x[1][i]);
swap(y[0][i], y[1][i]);
}
xs.PB(x[0][i]);
xs.PB(x[1][i]);
lines[i] = Line(x[0][i], y[0][i], x[1][i], y[1][i], i);
}
VI order(n);
iota(ALL(order), 0);
sort(ALL(order), [&](int i, int j){
int xl = max(x[0][i], x[0][j]);
int xr = min(x[1][i], x[1][j]);
if(xr < xl)
return false;
globalX = xl;
return lines[i] < lines[j];
});
reverse(ALL(order));
sort(ALL(xs));
l = lower_bound(ALL(xs), l) - xs.begin();
r = upper_bound(ALL(xs), r) - xs.begin() - 1;
T.build(1, 0, SZ(xs), l, r + 1);
for(int v : order)
{
int L = lower_bound(ALL(xs), x[0][v]) - xs.begin();
int R = upper_bound(ALL(xs), x[1][v]) - xs.begin() - 1;
int to = (y[0][v] < y[1][v]) ? L : R;
int mn = T.query(1, 0, SZ(xs), L, R + 1);
T.add(1, 0, SZ(xs), L, R + 1);
T.upd(1, 0, SZ(xs), to, mn);
}
cout << T.query(1, 0, SZ(xs), l, r + 1) << endl;
return 0;
}
Details
Test #1:
score: 100
Accepted
time: 2ms
memory: 13872kb
Test #2:
score: 0
Accepted
time: 0ms
memory: 13848kb
Test #3:
score: 0
Accepted
time: 0ms
memory: 5680kb
Test #4:
score: 0
Accepted
time: 1ms
memory: 5552kb
Test #5:
score: 0
Accepted
time: 1ms
memory: 5672kb
Test #6:
score: 0
Accepted
time: 0ms
memory: 13728kb
Test #7:
score: 0
Accepted
time: 2ms
memory: 14088kb
Test #8:
score: 0
Accepted
time: 1ms
memory: 13856kb
Test #9:
score: 0
Accepted
time: 1ms
memory: 14044kb
Test #10:
score: 0
Accepted
time: 1ms
memory: 13792kb
Test #11:
score: 0
Accepted
time: 1ms
memory: 14036kb
Test #12:
score: 0
Accepted
time: 680ms
memory: 68796kb
Test #13:
score: 0
Accepted
time: 0ms
memory: 13744kb
Test #14:
score: 0
Accepted
time: 2ms
memory: 14012kb
Test #15:
score: 0
Accepted
time: 0ms
memory: 13876kb
Test #16:
score: 0
Accepted
time: 2ms
memory: 14088kb
Test #17:
score: 0
Accepted
time: 2ms
memory: 13748kb
Test #18:
score: 0
Accepted
time: 0ms
memory: 13788kb
Test #19:
score: 0
Accepted
time: 2ms
memory: 13872kb
Test #20:
score: 0
Accepted
time: 0ms
memory: 13876kb
Test #21:
score: 0
Accepted
time: 0ms
memory: 13752kb
Test #22:
score: 0
Accepted
time: 2ms
memory: 13876kb
Test #23:
score: 0
Accepted
time: 0ms
memory: 13880kb
Test #24:
score: 0
Accepted
time: 2ms
memory: 13804kb
Test #25:
score: 0
Accepted
time: 0ms
memory: 14040kb
Test #26:
score: 0
Accepted
time: 2ms
memory: 14072kb
Test #27:
score: 0
Accepted
time: 2ms
memory: 13884kb
Test #28:
score: 0
Accepted
time: 2ms
memory: 14008kb
Test #29:
score: -100
Wrong Answer
time: 0ms
memory: 13748kb