JOI ã§ã¯ã馴æã¿ã®ã åã®åºéãæ±ãåé¡ãããã ãå®è£
ãããã©ãã£ããåã¯åºéã set ã§ç®¡çããæ¹æ³ã§å®è£
ããã
åé¡æ¦è¦
å¶ç´
èãããã¨
ããã«ã貪欲æ³ã®é¦ããæ¼ã£ã¦ããåé¡ã§ããããã®æã®åé¡ã§ã¯ã
åã®åºéãçµç«¯ã®æ©ãé ã«ã½ã¼ããã (åºéã¹ã±ã¸ã¥ã¼ãªã³ã°åé¡ãªã©)
- 1 æ¥ç®, 2 æ¥ç®, ... ã®é ã«ã¨ãã¹ãè¡åãèãã
ã¨ãã£ãã¢ããã¼ããæå¹ã§ããã2 çªç®ã®è§£æ³ã¯å ¬å¼è§£èª¬ã«ããã®ã§ãããã§ã¯ 1 çªç®ã®è§£æ³ã§è§£ãã¦ã¿ã¾ãã
çµç«¯ã®æ©ãé ã«ã½ã¼ã
åã®åºéã«é¢ããåé¡ã§ã¯ãåºéã®çµç«¯ã®æ©ãé ã«ã½ã¼ããã¦èãããã¨ã§ä¸æããããã¨ãé常ã«å¤ãã§ããä»åãããããªã¯ã¾ãã¾ãã次ã®ç´ æ´ãªæ¹æ³ãæé©è§£ãå°ãã¾ãã
çµç«¯ãæ©ãåºéããé ã«ãã¾ã å°ã®ã¤ãã¦ããªãæ¥ã«ã¤ãã¦ãåããé ã«æ大 æ¥ååãã¦ãã
念ã®çºã«ããã®æã®ãã®ã証æã§ããããã«ãªã£ã¦ããã¨è¯ãããã§ããä¾ã«ãã£ã¦ã交æãã¦ãæªåããªããã¨ãããã¯ããã¯ã§è¨¼æãã¾ãã
ããåºéã«ã¤ãã¦ãããå°ã®ã¤ãã¦ããªãæ¥ãé£ã°ãã¦ãå°ãã¤ãã¦ãã£ããããªæé©è§£ãåå¨ããã¨ãã¾ãããããã®è§£ã«å¯¾ãã¦ããå°ã®ã¤ããæ¥æ°ããå°ãããããã¨ãªããå°ã®ã¤ãã¦ããªãæ¥ãé£ã°ããªããããªè§£ã¸ã¨å¤å½¢ã§ãããã¨ã示ãã¾ãããã®ãããªè«æ³ã¯æ¬å½ã«é »åºã§ããã
ãã¦ãä»èãã¦ããåºéã ãé£ã°ããæ¥ã
ã¨ãã¾ããããå ´ååããã¦èãã¾ãã
1ï¼ãã®å¾ã®åºé
ã®ä¸ã«ãæ¥
ã«å°ãã¤ãããã®ããªãã¨ã
- ãã®å ´åã¯åç´ã«ãåºé
ã«ã¤ããå°ã®ãã¡æå¾ã®æ¥ [tex: e ãé¸ã¶
- æ¥
ã swap ãã¾ã
2ï¼ãã®å¾ã®åºé
ã®ä¸ã«ãæ¥
ã«å°ãã¤ãããã®ãããã¨ã
- åºé
ã«ã¤ããå°ã®ãã¡æå¾ã®æ¥ã
ã¨ãã
- ãã®ã¨ããåºé
ãããªããæ¥
ãå«ããã¨ã«æ³¨æãã¾ããã (ãããä¿è¨¼ããããã«åºéã®çµç«¯ã§ã½ã¼ããã¾ãã)
- åºé
ã¨åºé
ã¨ã§ãæ¥
ã®å°ã swap ãã¾ã
以ä¸ã®æ¹æ³ãç¹°ãè¿ããã¨ã§ããå°ã®ã¤ããæ¥æ°ããå°ãããããã¨ãªããå°ã®ã¤ãã¦ããªãæ¥ãé£ã°ããªããããªè§£ã¸ã¨å¤å½¢ã§ãã¾ãã
解æ³
ãã¨ã¯ã次ã®è§£æ³ãå®è£ ã§ããã°ãããã¨ã«ãªãã¾ããã
çµç«¯ãæ©ãåºéããé ã«ãã¾ã å°ã®ã¤ãã¦ããªãæ¥ã«ã¤ãã¦ãåããé ã«æ大 æ¥ååãã¦ãã
ãã®æ¹éã®å®è£
ã§æºç¹ãã¨ãã®ã¯ãå®éã®ã¨ããçµæ§å¤§å¤ã§ããæ¹éã¨ãã¦ã¯ãããã§ã«å°ã®ã¤ãã¦ããæ¥ããåºéã®éåã¨ã¿ãªãã¦ãset<pair<int,int>>
åã§ç®¡çãã¾ãã
ããã«å¯¾ãã¦ãåããé ã«æ大 æ¥ååãã¦ããéã«ããããã®åºéãåä½µããããªã©ãç¹°ãè¿ãã¦ããã¾ããçµå±å
¨ä½ã¨ãã¦
ã®è¨ç®éã§å®è£
ã§ãã¾ããå®éã®ã³ã¼ããèªãã¨æ©ãã¨æãã¾ãã
詳細ã¯ãåºéãsetã§ç®¡çãããã¯ããªã©ã¨èª¿ã¹ãã¨å¤§éã®è³æãè¦ã¤ããã¾ãããã¨ãã° ABC 256 Ex ã®è§£èª¬ã«ããã®è§£èª¬ãããã¾ãã
ã³ã¼ã
#include <bits/stdc++.h> using namespace std; using pll = pair<long long, long long>; const long long INF = 1LL<<60; int main() { long long res = 0; // å ¥å long long N, K; cin >> N >> K; vector<long long> A(N), B(N), C(N); for (int i = 0; i < N; ++i) { cin >> A[i] >> B[i] >> C[i]; ++B[i]; } // åºéã®çªå·ãçµç«¯ãæ©ãé ã«ã½ã¼ããã vector<int> ids(N); for (int i = 0; i < N; ++i) ids[i] = i; sort(ids.begin(), ids.end(), [&](int i, int j){return B[i] < B[j];}); // ãå°ã®ã¤ããæ¥ãããåºéã®éåã¨ã¿ãªãã¦ç®¡çãã set<pll> S; S.insert(pll(-INF, -INF)), S.insert(pll(INF, INF)); // çªå µ for (auto i : ids) { // æ大 C[i] æ¥ååãã¦ãã while (C[i] > 0 && A[i] < B[i]) { // åºéã®å§ç¹ A[i] ãåºé inter1 ã«å«ã¾ããå¯è½æ§ããããã // åºé inter2 ã®å§ç¹ã¯ A[i] ããå³ã«ãããã¨ãä¿è¨¼ãã auto inter2 = S.upper_bound(pll(A[i], INF)); auto inter1 = inter2; --inter1; // ãã¼ã¸ãã long long newA = A[i], newC = C[i]; if (A[i] <= inter1->second) { // A[i] ãåºé inter1 ã«å«ã¾ãã¦ããã¨ã if (min(inter1->second + C[i], B[i]) < inter2->first) { // æ大 C[i] æ¥æ°ãã«å°ãã¤ãã¦ããåºé inter2 ã«è¢«ããªãã¨ã res += min(inter1->second + C[i], B[i]) - inter1->second; newC -= min(inter1->second + C[i], B[i]) - inter1->second; newA = min(inter1->second + C[i], B[i]); pll p(inter1->first, min(inter1->second + C[i], B[i])); S.erase(inter1); S.insert(p); } else { // æ大 C[i] æ¥æ°ãã«å°ãã¤ããã¨ãåºé inter2 ã«è¢«ãã¨ã res += inter2->first - inter1->second; newC -= inter2->first - inter1->second; newA = min(inter2->second, B[i]); pll p(inter1->first, inter2->second); S.erase(inter1); S.erase(inter2); S.insert(p); } } else { // A[i] ãåºé inter1 ã«å«ã¾ããªãã¨ã if (min(A[i] + C[i], B[i]) < inter2->first) { // æ大 C[i] æ¥æ°ãã«å°ãã¤ãã¦ããåºé inter2 ã«è¢«ããªãã¨ã res += min(A[i] + C[i], B[i]) - A[i]; newC -= min(A[i] + C[i], B[i]) - A[i]; newA = min(A[i] + C[i], B[i]); S.insert(pll(A[i], newA)); } else { // æ大 C[i] æ¥æ°ãã«å°ãã¤ããã¨ãåºé inter2 ã«è¢«ãã¨ã res += inter2->first - A[i]; newC -= inter2->first - A[i]; newA = min(inter2->second, B[i]); pll p(A[i], inter2->second); S.erase(inter2); S.insert(p); } } A[i] = newA, C[i] = newC; } } cout << res << endl; }
ã
è§£æ³ 2ï¼1 æ¥ç®, 2 æ¥ç®, ... ã®é ã«ã¨ãã¹ãè¡åãèãã
å ¬å¼ã«åããããã解説ããã¦ãã¾ãï¼
https://www2.ioi-jp.org/joig-camp/2023/2023-sp-tasks/contest2/smartphone-review.pdf