Submission #122245

#TimeUsernameProblemLanguageResultExecution timeMemory
122245dualityCake 3 (JOI19_cake3)C++11
100 / 100
1048 ms26152 KiB
#define DEBUG 0 #include <bits/stdc++.h> using namespace std; #if DEBUG // basic debugging macros int __i__,__j__; #define printLine(l) for(__i__=0;__i__<l;__i__++){cout<<"-";}cout<<endl #define printLine2(l,c) for(__i__=0;__i__<l;__i__++){cout<<c;}cout<<endl #define printVar(n) cout<<#n<<": "<<n<<endl #define printArr(a,l) cout<<#a<<": ";for(__i__=0;__i__<l;__i__++){cout<<a[__i__]<<" ";}cout<<endl #define print2dArr(a,r,c) cout<<#a<<":\n";for(__i__=0;__i__<r;__i__++){for(__j__=0;__j__<c;__j__++){cout<<a[__i__][__j__]<<" ";}cout<<endl;} #define print2dArr2(a,r,c,l) cout<<#a<<":\n";for(__i__=0;__i__<r;__i__++){for(__j__=0;__j__<c;__j__++){cout<<setw(l)<<setfill(' ')<<a[__i__][__j__]<<" ";}cout<<endl;} // advanced debugging class // debug 1,2,'A',"test"; class _Debug { public: template<typename T> _Debug& operator,(T val) { cout << val << endl; return *this; } }; #define debug _Debug(), #else #define printLine(l) #define printLine2(l,c) #define printVar(n) #define printArr(a,l) #define print2dArr(a,r,c) #define print2dArr2(a,r,c,l) #define debug #endif // define #define MAX_VAL 999999999 #define MAX_VAL_2 999999999999999999LL #define EPS 1e-6 #define mp make_pair #define pb push_back // typedef typedef unsigned int UI; typedef long long int LLI; typedef unsigned long long int ULLI; typedef unsigned short int US; typedef pair<int,int> pii; typedef pair<LLI,LLI> plli; typedef vector<int> vi; typedef vector<LLI> vlli; typedef vector<pii> vpii; typedef vector<plli> vplli; // ---------- END OF TEMPLATE ---------- pii cake[200000]; priority_queue<pii,vpii,greater<pii> > H; priority_queue<pii> H2; LLI sum = 0; int ss,ee; int in[200000]; int insert(int i,int M) { while (in[H.top().second] != 1) H.pop(); if (cake[i].second > H.top().first) { H2.push(H.top()),in[H.top().second] = 2; sum -= H.top().first,H.pop(); H.push(mp(cake[i].second,i)),sum += cake[i].second; in[i] = 1; } else H2.push(mp(cake[i].second,i)),in[i] = 2; return 0; } int erase(int i,int M) { if (in[i] == 1) { while (in[H2.top().second] != 2) H2.pop(); sum -= cake[i].second; H.push(H2.top()),in[H2.top().second] = 1; sum += H2.top().first,H2.pop(); } in[i] = 0; return 0; } LLI query(int s,int e,int M) { if (e-s+1 < M) return -1e18; else { while (ss > s) insert(--ss,M); while (ee < e) insert(++ee,M); while (ss < s) erase(ss++,M); while (ee > e) erase(ee--,M); return sum-2*(cake[e].first-cake[s].first); } } LLI ans = -1e18; int solve(int l,int r,int al,int ar,int M) { if (l > r) return 0; int i,m = (l+r) / 2,b = al; LLI best = -1e18; for (i = al; i <= ar; i++) { LLI x = query(m,i,M); if (x > best) best = x,b = i; } ans = max(ans,best); solve(l,m-1,al,b,M),solve(m+1,r,b,ar,M); return 0; } int main() { int i; int N,M; scanf("%d %d",&N,&M); for (i = 0; i < N; i++) scanf("%d %d",&cake[i].second,&cake[i].first); sort(cake,cake+N); for (i = 0; i < M; i++) H.push(mp(cake[i].second,i)),in[i] = 1,sum += cake[i].second; ss = 0,ee = M-1; solve(0,N-M,0,N-1,M); printf("%lld\n",ans); return 0; }

Compilation message (stderr)

cake3.cpp: In function 'int main()':
cake3.cpp:111:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&N,&M);
     ~~~~~^~~~~~~~~~~~~~~
cake3.cpp:112:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (i = 0; i < N; i++) scanf("%d %d",&cake[i].second,&cake[i].first);
                             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...