이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define P pair<ll,ll>
using namespace std;
const int maxn = 100100;
const ll inf = (1LL<<50);
int n, m;
ll a[maxn], b[maxn],c[maxn], d[maxn], br;
set<ll>st;
map<ll,int>ind;
P tree[12*maxn];
ll dpl[maxn], dpr[maxn];
class node {
public:
P value = mp(inf, inf);
ll lbound, rbound;
node *lchild, *rchild;
node(ll _lb, ll _rb) {
lchild = rchild = NULL;
lbound = _lb;
rbound = _rb;
}
P lvalue() {
if(lchild == NULL) return mp(inf, inf);
else return lchild->value;
}
P rvalue() {
if(rchild == NULL) return mp(inf, inf);
else return rchild->value;
}
void update(int uind, bool type, ll val) {
if(lbound == rbound) {
if(type == 0) value.first = min(value.first, val);
else value.second = min(value.second, val);
}
else {
int mid = (lbound + rbound) / 2;
if(uind <= mid) {
if(lchild == NULL)
lchild = new node(lbound, mid);
lchild -> update(uind, type, val);
}
else {
if(rchild == NULL)
rchild = new node(mid+1, rbound);
rchild -> update(uind, type, val);
}
P lval = lvalue();
P rval = rvalue();
value.first = min(lval.first, rval.first);
value.second = min(lval.second, rval.second);
}
}
P query(int ql, int qr) {
if(lbound > qr || rbound < ql) return mp(inf, inf);
else if(lbound >= ql && rbound <= qr) return value;
else {
P lval, rval;
if(lchild == NULL) lval = mp(inf, inf);
else lval = lchild -> query(ql, qr);
if(rchild == NULL) rval = mp(inf, inf);
else rval = rchild -> query(ql, qr);
return mp(min(lval.first, rval.first), min(lval.second, rval.second));
}
}
};
int main() {
cin>>n>>m;
for(int i=0;i<n;i++) {
cin>>a[i]>>b[i]>>c[i]>>d[i];
}
node *root = new node(1, m);
ll result = LLONG_MAX;
for(int i=0;i<n;i++) {
// O(N^2) algorithm
/*dpl[i] = dpr[i] = inf;
if(a[i] == 1) {
dpl[i] = d[i];
}
if(b[i] == m) {
dpr[i] = d[i];
}
for(int j=0;j<i;j++) {
if(c[j] >= a[i] && c[j] <= b[i]) {
dpl[i] = min(dpl[i], dpl[j] + d[i]);
dpr[i] = min(dpr[i], dpr[j] + d[i]);
}
}*/
// O(NlogN) algorithm, doesn't work
//cout<<i<<":\n";
if(a[i] == 1) {
dpl[i] = d[i];
root->update(c[i], 0, dpl[i]);
}
else {
P X = root->query(a[i], b[i]);
dpl[i] = X.first + d[i];
//cout<<X.first<<"\n";
root->update(c[i], 0, dpl[i]);
}
if(b[i] == m) {
dpr[i] = d[i];
root->update(c[i], 1, dpr[i]);
}
else {
P X = root->query(a[i], b[i]);
if(X.second == inf) dpr[i] = inf;
else dpr[i] = X.second + d[i];
root->update(c[i], 1, dpr[i]);
}
//cout<<dpl[i]<<" + "<<dpr[i]<<" - "<<d[i]<<"\n";
result = min(result, dpl[i] + dpr[i] - d[i]);
}
if(result >= inf) {
cout<<"-1\n";
}
else {
cout<<result<<"\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |