Submission #122178

#TimeUsernameProblemLanguageResultExecution timeMemory
122178dualityCake 3 (JOI19_cake3)C++11
100 / 100
3949 ms15096 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]; set<pii> S,S2; LLI sum = 0; int ss,ee; int insert(int i,int M) { if (cake[i].second > S.begin()->first) { S2.insert(*S.begin()); sum -= S.begin()->first,S.erase(S.begin()); S.insert(mp(cake[i].second,i)),sum += cake[i].second; } else S2.insert(mp(cake[i].second,i)); return 0; } int erase(int i,int M) { auto it = S.find(mp(cake[i].second,i)); if (it != S.end()) { sum -= it->first,S.erase(it); S.insert(*(--S2.end())),sum += (--S2.end())->first; S2.erase(--S2.end()); } else S2.erase(mp(cake[i].second,i)); 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++) S.insert(mp(cake[i].second,i)),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:107: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:108: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...