ジャッジは通るが、最悪計算量はO(n^2)で
100000 100000
1 1 1
1 1 2
1 1 3
...
1 1 99999
1 1 100000
のような入力で落とせる。
#include <bits/stdc++.h> | |
using namespace std; | |
typedef long long ll; | |
typedef vector<int> vi; | |
#define rep(var,n) for(int var=0;var<(n);++var) | |
#define PQ(T) priority_queue<T,vector<T>,greater<T>> | |
ll solve(int N, int M, vi& c, vi& l, vi& r) { | |
using P = tuple<int, int, int>; | |
PQ(P) pq; | |
rep(i,M) pq.emplace(l[i], c[i], r[i]); | |
ll cost = 0; | |
rep(i,N){ | |
if (pq.empty() || get<0>(pq.top()) > i) return -1; | |
auto [li, ci, ri] = pq.top(); pq.pop(); | |
cost += ci; | |
while (!pq.empty() && get<0>(pq.top()) == i) { | |
auto [lj, cj, rj] = pq.top(); pq.pop(); | |
if (rj == ri) continue; | |
pq.emplace(min(ri,rj), cj, max(ri,rj)); | |
} | |
} | |
return cost; | |
} | |
int main() { | |
int N, M; scanf("%d %d%*c", &N, &M); | |
vi c(M), l(M), r(M); | |
rep(i,M){ | |
scanf("%d %d %d%*c", &c[i], &l[i], &r[i]); | |
--l[i]; | |
} | |
printf("%lld\n", solve(N,M,c,l,r)); | |
return 0; | |
} |
ジャッジは通るが、最悪計算量はO(n^2)で
100000 100000
1 1 1
1 1 2
1 1 3
...
1 1 99999
1 1 100000
のような入力で落とせる。