제출 #60835

#제출 시각아이디문제언어결과실행 시간메모리
60835duality새 집 (APIO18_new_home)C++11
57 / 100
5041 ms249020 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 ---------- struct event { int time,t,x; }; bool comp(event a,event b) { if (a.time == b.time) return a.t < b.t; else return a.time < b.time; } vi sorted; vector<event> events; multiset<int> stores[300000]; multimap<pii,int> M; vpii tree[1 << 20]; int ans[300000]; int update(int s,int e,int as,int ae,int i,pii p) { if (as > ae) return 0; else if ((s > ae) || (e < as)) return 0; else if ((s >= as) && (e <= ae)) { tree[i].pb(p); return 0; } int mid = (s+e) / 2; update(s,mid,as,ae,2*i+1,p); update(mid+1,e,as,ae,2*i+2,p); return 0; } int query(int s,int e,int q,int i,pii p) { if ((s > q) || (e < q)) return 0; else if (s == e) { tree[i].pb(p); return 0; } int mid = (s+e) / 2; query(s,mid,q,2*i+1,p); query(mid+1,e,q,2*i+2,p); tree[i].pb(p); return 0; } int solve(int s,int e,int i) { int j,k; pii m = mp(-3e8,0); sort(tree[i].begin(),tree[i].end()); for (j = 0; j < tree[i].size(); j++) { if (tree[i][j].second >= 0) { if (tree[i][j].second > m.second-(tree[i][j].first-m.first)) m = tree[i][j]; } else ans[-tree[i][j].second-1] = max(ans[-tree[i][j].second-1],m.second-(tree[i][j].first-m.first)); } m = mp(3e8,0); for (j = tree[i].size()-1; j >= 0; j--) { if (tree[i][j].second >= 0) { if (tree[i][j].second > m.second-(m.first-tree[i][j].first)) m = tree[i][j]; } else ans[-tree[i][j].second-1] = max(ans[-tree[i][j].second-1],m.second-(m.first-tree[i][j].first)); } if (s != e) { int mid = (s+e) / 2; solve(s,mid,2*i+1),solve(mid+1,e,2*i+2); } return 0; } int main() { int i; int n,k,q; int x,t,a,b,l,y; scanf("%d %d %d",&n,&k,&q); sorted.pb(0),sorted.pb(3e8); for (i = 0; i < n; i++) { scanf("%d %d %d %d",&x,&t,&a,&b); events.pb((event){a,t,x}); events.pb((event){b+1,-t,x}); sorted.pb(a),sorted.pb(b+1); } sort(events.begin(),events.end(),comp); sort(sorted.begin(),sorted.end()); sorted.resize(unique(sorted.begin(),sorted.end())-sorted.begin()); for (i = 0; i < k; i++) { stores[i].insert(-3e8),stores[i].insert(3e8); M.insert(mp(mp(0,6e8),0)); } for (i = 0; i < events.size(); i++) { events[i].time = lower_bound(sorted.begin(),sorted.end(),events[i].time)-sorted.begin(); if (events[i].t > 0) { auto it = stores[events[i].t-1].lower_bound(events[i].x); auto it2 = it; it2--; auto it3 = M.find(mp(*it+*it2,*it-*it2)); update(0,sorted.size()-2,it3->second,events[i].time-1,0,mp(*it+*it2,*it-*it2)); M.erase(it3); M.insert(mp(mp(*it+events[i].x,*it-events[i].x),events[i].time)); M.insert(mp(mp(events[i].x+*it2,events[i].x-*it2),events[i].time)); stores[events[i].t-1].insert(events[i].x); } else { auto it = stores[-events[i].t-1].lower_bound(events[i].x); auto it2 = it; it2--; auto it3 = M.find(mp(*it+*it2,*it-*it2)); update(0,sorted.size()-2,it3->second,events[i].time-1,0,mp(*it+*it2,*it-*it2)); M.erase(it3); it++,it2++; it3 = M.find(mp(*it+*it2,*it-*it2)); update(0,sorted.size()-2,it3->second,events[i].time-1,0,mp(*it+*it2,*it-*it2)); M.erase(it3); it2--; M.insert(mp(mp(*it+*it2,*it-*it2),events[i].time)); stores[-events[i].t-1].erase(--it); } } for (auto it = M.begin(); it != M.end(); it++) update(0,sorted.size()-2,it->second,sorted.size()-2,0,it->first); M.clear(); for (i = 0; i < q; i++) { scanf("%d %d",&l,&y); int p = upper_bound(sorted.begin(),sorted.end(),y)-sorted.begin()-1; query(0,sorted.size()-2,p,0,mp(2*l,-(i+1))); } solve(0,sorted.size()-2,0); for (i = 0; i < q; i++) printf("%d\n",(ans[i] > 3e8) ? -1:ans[i]/2); return 0; }

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

new_home.cpp: In function 'int solve(int, int, int)':
new_home.cpp:99:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (j = 0; j < tree[i].size(); j++) {
                 ~~^~~~~~~~~~~~~~~~
new_home.cpp:96:11: warning: unused variable 'k' [-Wunused-variable]
     int j,k;
           ^
new_home.cpp: In function 'int main()':
new_home.cpp:137:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < events.size(); i++) {
                 ~~^~~~~~~~~~~~~~~
new_home.cpp:122:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d",&n,&k,&q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~
new_home.cpp:125:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d %d",&x,&t,&a,&b);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:169:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d",&l,&y);
         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...