Submission #294458

#TimeUsernameProblemLanguageResultExecution timeMemory
294458CaroLindaNew Home (APIO18_new_home)C++14
0 / 100
3910 ms699584 KiB
#include <bits/stdc++.h> #define lp(i,a,b) for(int i = a; i < b; i++) #define pb push_back #define sz(x) (int)(x.size()) #define all(x) x.begin(),x.end() #define debug //printf #define tiii tuple<int,int,int> #define mkt make_tuple #define pii pair<int,int> #define mk make_pair #define ll long long #define ff first #define ss second const int MAXN = 6e5+100 ; const int MAXT = 1e8+10 ; const int MAX_COORD = 3e8+7 ; using namespace std ; struct Event { int xConta, xIntercept, type , t1, t2 ; Event(int a=0, int b=0, int c=0, int d=0, int e=0) : xConta(a), xIntercept(b), type(c) , t1(d), t2(e){} }; int ansQuery[MAXN] ; struct Seg { vector<Event> tree[MAXN*2] ; int m(int l, int r) { return (l+r)>>1 ; } void insertEvent(int pos, int l, int r, int t1, int t2, Event e) { if( l > t2 || r < t1 ) return ; if( e.type > 0 ) tree[pos].push_back(e) ; if( l >= t1 && r <= t2 ) return (void)( tree[pos].push_back(e) ); int lef = pos+1 ; int rig = pos+2*( m(l,r) - l + 1 ); insertEvent( lef, l, m(l,r) , t1, t2 , e ) ; insertEvent(rig, m(l,r)+1, r, t1, t2 , e) ; } void solve(int pos, int l, int r ) { int mxNegative = -MAXT , mnPositive = MAXT ; for(auto e : tree[pos]) { if( e.type == 0 ) continue ; if( e.type > 0 ) ansQuery[ e.type ] = max( ansQuery[e.type] , mxNegative - e.xConta ) , debug("mxNegative = %d\n" , mxNegative ) ; else mxNegative = max(mxNegative, e.xIntercept ) ; } reverse(all(tree[pos])) ; for(auto e : tree[pos]) { if( e.type < 0 ) continue ; if( e.type > 0 ) ansQuery[e.type] = max( ansQuery[e.type] , e.xConta - mnPositive ) , debug("mnPositive = %d\n" , mnPositive ) ; else mnPositive = min(mnPositive, e.xIntercept ) ; } if(l == r) return ; solve(pos+1, l , m(l,r) ) ; solve( pos + 2*( m(l,r) - l + 1 ) , m(l,r)+1, r ) ; } } seg ; //O ANO PODE IR ATÉ 10^8 //VAI TER QUE FAZER COMPRESSÃO int N , K , Q ; vector< tiii > myVecOfTuples ; set<int> store[MAXN] ; map< pii , int > segments[MAXN] ; vector<Event> sweep ; map<int,int> compressionTime ; map<int, vector<pii> > mySet[MAXN] ; void operation( set<int>::iterator itLess, set<int>::iterator itMore , int type , int clock , bool isRemoval ) { int midPointL = (*itMore + *itLess)>>1 ; int midPointR = (*itMore + *itLess+1)>>1; if(isRemoval) { Event a = Event( midPointL, *itLess, 0 , segments[type][ mk(midPointL,*itLess) ] , clock ); Event b = Event( midPointR, *itMore, -1 , segments[type][ mk(midPointR, *itMore) ] , clock ) ; segments[type].erase( segments[type].find( mk(midPointL, *itLess) ) ) ; segments[type].erase( segments[type].find( mk(midPointR, *itMore) ) ) ; if(a.t1 <= a.t2) sweep.pb(a); if(b.t1 <= b.t2 ) sweep.pb(b) ; } else { segments[ type ][ mk(midPointL, *itLess) ] = clock ; segments[type][ mk(midPointR, *itMore) ] = clock ; } } void insertion(int x_coord, int type, int clock ) { auto itMore = store[type].lower_bound(x_coord) ; auto itLess = itMore ; itLess-- ; operation( itLess, itMore, type, clock-1 , true) ; store[type].insert( x_coord ) ; itMore = store[type].find( x_coord ) ; itLess = itMore ; itLess-- ; operation( itLess, itMore, type, clock, false ) ; itLess = itMore ; itLess++ ; swap(itMore, itLess) ; operation( itLess, itMore, type, clock, false ); } void removal(int x_coord, int type, int clock ) { auto itMore = store[type].find(x_coord) ; auto itLess = itMore ; itLess-- ; operation( itLess, itMore, type, clock, true ) ; itLess = itMore ; itLess++ ; swap(itMore, itLess) ; operation( itLess, itMore, type, clock, true ) ; store[type].erase(itLess); itMore = store[type].lower_bound(x_coord); itLess = itMore ; itLess--; operation( itLess, itMore, type, clock+1, false ) ; } int main() { scanf("%d%d%d", &N , &K , &Q ) ; for(int i = 1 ; i <= K ; i++ ) { store[i].insert( -MAX_COORD ) ; store[i].insert( MAX_COORD ) ; operation( store[i].begin() , prev( store[i].end() ) , i , 1, false ) ; } for(int i = 1 , x , t , a , b ; i <= N ; i++ ) { scanf("%d%d%d%d", &x, &t, &a, &b ) ; mySet[t][x].push_back( mk(a,b) ) ; /* myVecOfTuples.pb( mkt( a, t, x ) ) ; myVecOfTuples.pb( mkt(b,-t, x) ) ; */ } for(int i = 1 ; i <= K ; i++ ) { for(auto &aux: mySet[i] ) { vector<pii> x_coord = aux.ss ; sort(all(x_coord)) ; x_coord.pb( mk( MAXT, MAXT ) ) ; int mnTime = x_coord[0].ff ; int mxTime = x_coord[0].ss ; for(int j = 1 ; j < sz(x_coord) ; j++ ) { if( x_coord[j].ff > mxTime ) { myVecOfTuples.pb( mkt( mnTime , -i, aux.ff ) ) ; myVecOfTuples.pb( mkt( mxTime, i, aux.ff ) ) ; } else mxTime = max(mxTime, x_coord[j].ss ) ; } } } sort(all(myVecOfTuples)) ; for(auto tup : myVecOfTuples ) { int clock = get<0>(tup) ; int type = get<1>(tup) ; int x_coord = get<2>(tup) ; debug("Eh a vez de %d %d %d\n" , x_coord, type, clock ) ; if( type < 0 ) insertion( x_coord , -type, clock ) ; else removal( x_coord, type, clock ); } for(int i = 1 ; i <= K ; i++ ) operation( store[i].begin() , prev( store[i].end() ) , i , MAXT, true ) ; for(int i = 1 , l , y ; i <= Q ; i++ ) { scanf("%d%d", &l, &y ) ; sweep.pb( Event(l,l,i,y,y) ); } sort(all(sweep), [&](Event a, Event b) { if( a.xConta != b.xConta ) return a.xConta < b.xConta ; else return a.type < b.type ; } ); for(auto &e : sweep ) { if( compressionTime.find( e.t1 ) == compressionTime.end() ) compressionTime[e.t1] = 0 ; if( compressionTime.find( e.t2 ) == compressionTime.end() ) compressionTime[e.t2] = 0 ; } int Key = 1 ; for(auto &e : compressionTime ) e.ss = Key++ ; for(auto e : sweep ) seg.insertEvent( 1 , 1 , sz(compressionTime) , compressionTime[e.t1] , compressionTime[e.t2] , e ) ; seg.solve(1,1, sz(compressionTime) ) ; for(int i = 1 ; i <= Q ; i++ ) printf("%d\n" , ansQuery[i] > 100000010 ? -1 : ansQuery[i] ) ; } /* 1 1 1 5 1 2 5 1 1 1 5 1 1 10 7 5 2 1 3 1 1 1 4 1 1 2 6 1 3 1 5 1 7 4 2 4 3 1 1 10 4 1 8 10 9 2 2 4 7 2 5 7 5 3 5 6 5 9 1 10 1 1 1 100000000 1 1 1 1 1 1 Eh a vez de 3 1 1 Eh a vez de 9 2 2 Eh a vez de 9 -2 4 Eh a vez de 7 2 5 Eh a vez de 7 -2 7 Eh a vez de 4 1 8 Eh a vez de 3 -1 10 Eh a vez de 4 -1 10 */

Compilation message (stderr)

new_home.cpp: In member function 'void Seg::solve(int, int, int)':
new_home.cpp:61:107: warning: left operand of comma operator has no effect [-Wunused-value]
   61 |             if( e.type > 0 ) ansQuery[ e.type ] = max( ansQuery[e.type] , mxNegative - e.xConta ) , debug("mxNegative = %d\n" , mxNegative ) ;
      |                                                                                                           ^~~~~~~~~~~~~~~~~~~
new_home.cpp:70:106: warning: left operand of comma operator has no effect [-Wunused-value]
   70 |             if( e.type > 0 )  ansQuery[e.type] = max( ansQuery[e.type] , e.xConta - mnPositive ) , debug("mnPositive = %d\n" , mnPositive ) ;
      |                                                                                                          ^~~~~~~~~~~~~~~~~~~
new_home.cpp: In function 'int main()':
new_home.cpp:220:15: warning: left operand of comma operator has no effect [-Wunused-value]
  220 |         debug("Eh a vez de %d %d %d\n" , x_coord, type, clock ) ;
      |               ^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:220:51: warning: right operand of comma operator has no effect [-Wunused-value]
  220 |         debug("Eh a vez de %d %d %d\n" , x_coord, type, clock ) ;
      |                                                   ^~~~
new_home.cpp:220:57: warning: right operand of comma operator has no effect [-Wunused-value]
  220 |         debug("Eh a vez de %d %d %d\n" , x_coord, type, clock ) ;
      |                                                         ^~~~~
new_home.cpp:167:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  167 |     scanf("%d%d%d", &N , &K , &Q ) ;
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:179:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  179 |         scanf("%d%d%d%d", &x, &t, &a, &b ) ;
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:232:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  232 |         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...