제출 #1003290

#제출 시각아이디문제언어결과실행 시간메모리
1003290onbert별자리 3 (JOI20_constellation3)C++17
35 / 100
1541 ms62760 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 2e5 + 5, maxN = 4e5 + 5, INF = 1e18; struct range { int l, r; bool operator < (const range &b) const { if (r - l != b.r - b.l) return r - l < b.r - b.l; if (l != b.l) return l < b.l; return r < b.r; } bool operator == (const range &b) const { return (l == b.l && r == b.r); } }; struct node { int x, y, c; bool operator < (const node &b) const { if (y!=b.y) return y < b.y; if (x!=b.x) return x < b.x; return c < b.c; } }; vector<node> star; int dc1(node x) {return lower_bound(star.begin(), star.end(), x) - star.begin();} vector<range> ranges; int dc2(range x) {return lower_bound(ranges.begin(), ranges.end(), x) - ranges.begin();} int sum[maxn]; vector<pair<int,int>> sub[maxn]; int ansR[maxn], ansS[maxN]; int worth(int x, int y, int R) { int val = sum[R]; auto [l, r] = *prev(upper_bound(sub[R].begin(), sub[R].end(), make_pair(x, INF))); if (l <= x && x <= r) { int ID = dc2({l, r}); val -= ansR[ID]; val += worth(x, y, ID); // if (x == 5 && y == 8) cout << "test " << ansS[dc1({x, A[x]+1, 0})] << endl; // cout << "Test " << x << " " << A[x]+1 << " " << 0 << " " << ansS[dc1({x, A[x]+1, 0})] << endl; } return val; } signed main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; pair<int,int> a[n+1]; int A[n+1]; for (int i=1;i<=n;i++) { cin >> a[i].first; a[i].second = i; A[i] = a[i].first; } sort(a+1, a+n+1); int m, SUM = 0; cin >> m; for (int i=1;i<=m;i++) { int x, y, c; cin >> x >> y >> c; star.push_back({x, y, c}); SUM += c; } for (int i=1;i<=n;i++) star.push_back({a[i].second, a[i].first + 1, 0}); set<int> s; for (int i=0;i<=n+1;i++) s.insert(i); int last = 1; for (int i=1;i<=n;i++) { for (; a[last].first < a[i].first; last++) { auto it = s.upper_bound(a[last].second); ranges.push_back({*prev(it) + 1, *it - 1}); // cout << "1 " << a[last].second << " " << ranges.back().first << " " << ranges.back().second << endl; } s.erase(a[i].second); } for (; last<=n; last++) { auto it = s.upper_bound(a[last].second); ranges.push_back({*prev(it) + 1, *it - 1}); // cout << "2 " << a[last].second << " " << ranges.back().first << " " << ranges.back().second << endl; } sort(ranges.begin(), ranges.end()); ranges.erase(unique(ranges.begin(), ranges.end()), ranges.end()); int sz = ranges.size(); sort(star.begin(), star.end()); vector<node> mem[sz]; for (int i=0;i<sz;i++) sub[i] = {{0, 0}, {ranges[i].l, -1}}; for (int i=1;i<=n;i++) s.insert(i); last = 1; for (auto [x, y, c]:star) { // cout << x << " " << y << " " << c << endl; for (;last <= n && a[last].first < y; last++) s.erase(a[last].second); auto it = s.lower_bound(x); int l = *prev(it) + 1, r = *it - 1; int id = dc2({l, r}); if (c!=0) mem[id].push_back({x, y, c}); // cout << id << endl; if (c==0) { if (x-1>=sub[id].back().first) { sub[id].back().second = x-1; sub[id].push_back({x+1, -1}); } else sub[id].back().first = x+1; } } for (int i=0;i<sz;i++) { if (sub[i].back().first <= ranges[i].r) sub[i].back().second = ranges[i].r; else sub[i].pop_back(); sub[i].push_back({INF, INF}); } for (int i=0;i<sz;i++) { sum[i] = 0; for (auto [l, r]:sub[i]) { if (l!=0 && l!=INF) sum[i] += ansR[dc2({l, r})]; } ansR[i] = sum[i]; // cout << ranges[i].l << " " << ranges[i].r << " " << sum << endl; for (auto [x, y, c]:mem[i]) { int id = dc1({x, y, c}); ansS[id] = worth(x, y, i) + c; ansR[i] = max(ansS[id], ansR[i]); } } cout << SUM - ansR[dc2({1, n})] << endl; }

컴파일 시 표준 에러 (stderr) 메시지

constellation3.cpp: In function 'int main()':
constellation3.cpp:50:9: warning: variable 'A' set but not used [-Wunused-but-set-variable]
   50 |     int A[n+1];
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...