#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define FR(i,a) for(int i = 0; i < (a); i++)
using namespace std;
long T,N, s[ ] ,d[ ] ,w[ ] ;
long nextstart_idx,nextdeadline_idx;
struct item
{
double start,end,w;
} ;
struct copitem
{
double start,end,a_idx;
} ;
struct sort_by_one_item
{
bool operator ( ) ( const item & lhs , const item& rhs) // replace YourStruct
{
if ( lhs.end == rhs.end )
return lhs.start < rhs.start ;
return lhs.end < rhs.end ;
}
} ;
struct sort_by_one_copitem
{
bool operator ( ) ( const copitem & lhs , const copitem& rhs) // replace YourStruct
{
if ( lhs.start == rhs.start )
return lhs.end < rhs.end ;
return lhs.start < rhs.start ;
}
} ;
vector< item> a,savea;
vector< copitem> b,saveb;
bool check( long speed)
{
long count= 0 ;
while ( count< a.size ( ) )
{
long i= 0 ;
while ( ! b[ i] .start )
{
i++ ;
}
nextstart_idx = b[ i] .a_idx ;
nextdeadline_idx = 0 ;
while ( ! a[ nextdeadline_idx] .start )
{
nextdeadline_idx++ ;
}
if ( a[ nextstart_idx] .start == a[ nextdeadline_idx] .start && ( nextstart_idx! = nextdeadline_idx) )
{
nextstart_idx = nextdeadline_idx;
i= 0 ;
while ( b[ i] .a_idx ! = nextstart_idx) i++ ;
}
if ( nextdeadline_idx== nextstart_idx)
{
if ( nextdeadline_idx< a.size ( ) - 1 )
if ( a[ nextdeadline_idx+ 1 ] .end == a[ nextdeadline_idx] .end ) return false ;
if ( ( double ) a[ nextstart_idx] .w / ( double ) speed + ( double ) ( a[ nextstart_idx] .start ) > ( double ) ( a[ nextstart_idx] .end ) ) return false ;
// do all job, clear b[0] and a[0]
//a.erase(a.begin());b.erase(b.begin());
if ( i< b.size ( ) - 1 )
{
long j= - 1 ,min= 100000 ;
FR( v,b.size ( ) - 1 )
{
if ( b[ v] .start < min && v! = i && b[ v] .start ) { j= v; min= b[ v] .start ; }
}
if ( j> - 1 )
if ( b[ j] .start <= ( double ) a[ nextstart_idx] .w / ( double ) speed + ( double ) ( a[ nextstart_idx] .start ) )
{
b[ j] .start = ( double ) a[ nextstart_idx] .w / ( double ) speed + ( double ) ( a[ nextstart_idx] .start ) ;
a[ b[ j] .a_idx ] .start = ( double ) a[ nextstart_idx] .w / ( double ) speed + ( double ) ( a[ nextstart_idx] .start ) ;
}
}
a[ nextstart_idx] .end = 0 ; a[ nextstart_idx] .start = 0 ;
b[ i] .end = 0 ; b[ i] .start = 0 ;
count++ ;
// check false case
continue ;
}
if ( a[ nextstart_idx] .end > a[ nextdeadline_idx] .start )
{
a[ nextstart_idx] .w - = speed* ( a[ nextdeadline_idx] .start - a[ nextstart_idx] .start ) ;
if ( a[ nextstart_idx] .w <= 0 )
{
a[ nextstart_idx] .end = 0 ; a[ nextstart_idx] .start = 0 ;
b[ nextdeadline_idx] .end = 0 ; b[ nextdeadline_idx] .start = 0 ;
count++ ;
continue ;
}
a[ nextstart_idx] .start = a[ nextdeadline_idx] .start ;
b[ i] .start = a[ nextdeadline_idx] .start ;
}
}
return true ;
}
long long find( long left, long right)
{
b= saveb; a= savea;
if ( left== right- 1 )
{
if ( check( left) ) return left;
else return right;
}
long mid = ( left+ right) / 2 ;
if ( check( mid) ) return find( left,mid) ;
else return find( mid,right) ;
}
void process( )
{
sort( a.begin ( ) ,a.end ( ) ,sort_by_one_item( ) ) ;
b.clear ( ) ;
FR( v,N)
{
item temp = a[ v] ;
copitem temp1;
temp1.end = temp.end ; temp1.start = temp.start ; temp1.a_idx = v;
b.push_back ( temp1) ;
}
sort( b.begin ( ) ,b.end ( ) ,sort_by_one_copitem( ) ) ;
savea= a; saveb= b;
long long t = find( 0 ,10000 ) ;
printf ( "%d\n " ,t) ;
}
int main ( )
{
scanf ( "%d" , & T) ;
FR( o,T)
{
a.clear ( ) ;
scanf ( "%d" , & N) ;
FR( v,N)
{
item temp;
scanf ( "%lf%lf%lf" , & temp.start ,& temp.end ,& temp.w ) ;
a.push_back ( temp) ;
}
process( ) ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHZlY3Rvcj4KCiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGkgPSAoYSk7IGkgPD0gKGIpOyBpKyspCiNkZWZpbmUgRlIoaSxhKSBmb3IoaW50IGkgPSAwOyBpIDwgKGEpOyBpKyspCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKbG9uZyBULE4sIHNbXSxkW10sd1tdOwoKbG9uZyBuZXh0c3RhcnRfaWR4LG5leHRkZWFkbGluZV9pZHg7CnN0cnVjdCBpdGVtCnsKCWRvdWJsZSBzdGFydCxlbmQsdzsKfTsKc3RydWN0IGNvcGl0ZW0KewoJZG91YmxlIHN0YXJ0LGVuZCxhX2lkeDsKfTsKc3RydWN0IHNvcnRfYnlfb25lX2l0ZW0KewoJYm9vbCBvcGVyYXRvciAoKSAoY29uc3QgaXRlbSAmbGhzICwgY29uc3QgaXRlbSYgcmhzKSAvLyByZXBsYWNlIFlvdXJTdHJ1Y3QKCXsKCQlpZihsaHMuZW5kID09IHJocy5lbmQpCgkJCXJldHVybiBsaHMuc3RhcnQgPCByaHMuc3RhcnQ7CgoJCXJldHVybiBsaHMuZW5kIDwgcmhzLmVuZDsKCX0KfTsKc3RydWN0IHNvcnRfYnlfb25lX2NvcGl0ZW0KewoJYm9vbCBvcGVyYXRvciAoKSAoY29uc3QgY29waXRlbSAmbGhzICwgY29uc3QgY29waXRlbSYgcmhzKSAvLyByZXBsYWNlIFlvdXJTdHJ1Y3QKCXsKCQlpZihsaHMuc3RhcnQgPT0gcmhzLnN0YXJ0KQoJCQlyZXR1cm4gbGhzLmVuZCA8IHJocy5lbmQ7CgoJCXJldHVybiBsaHMuc3RhcnQgPCByaHMuc3RhcnQ7Cgl9Cn07CnZlY3RvcjxpdGVtPiBhLHNhdmVhOwp2ZWN0b3I8Y29waXRlbT4gYixzYXZlYjsKCmJvb2wgY2hlY2sobG9uZyBzcGVlZCkKewoJbG9uZyBjb3VudD0wOwoJd2hpbGUgKGNvdW50PGEuc2l6ZSgpKQoJewoJCWxvbmcgaT0wOwoJCXdoaWxlICghYltpXS5zdGFydCkKCQl7CgkJCWkrKzsKCQl9CgkJbmV4dHN0YXJ0X2lkeCA9IGJbaV0uYV9pZHg7CgkJbmV4dGRlYWRsaW5lX2lkeCA9IDA7IAkJCgkJd2hpbGUgKCFhW25leHRkZWFkbGluZV9pZHhdLnN0YXJ0KQoJCXsKCQkJbmV4dGRlYWRsaW5lX2lkeCsrOwoJCX0KCQlpZiAoYVtuZXh0c3RhcnRfaWR4XS5zdGFydD09YVtuZXh0ZGVhZGxpbmVfaWR4XS5zdGFydCAmJiAobmV4dHN0YXJ0X2lkeCE9bmV4dGRlYWRsaW5lX2lkeCkgKQoJCXsKCQkJCW5leHRzdGFydF9pZHggPSBuZXh0ZGVhZGxpbmVfaWR4OwoJCQkJaT0wOwoJCQkJd2hpbGUgKGJbaV0uYV9pZHghPW5leHRzdGFydF9pZHgpIGkrKzsKCQl9CgkJaWYgKG5leHRkZWFkbGluZV9pZHg9PW5leHRzdGFydF9pZHgpCgkJewoJCQlpZiAobmV4dGRlYWRsaW5lX2lkeDxhLnNpemUoKS0xKQoJCQkJaWYgKGFbbmV4dGRlYWRsaW5lX2lkeCsxXS5lbmQ9PWFbbmV4dGRlYWRsaW5lX2lkeF0uZW5kKSByZXR1cm4gZmFsc2U7CgkJCWlmICgoZG91YmxlKWFbbmV4dHN0YXJ0X2lkeF0udy8oZG91YmxlKXNwZWVkICsgKGRvdWJsZSkoYVtuZXh0c3RhcnRfaWR4XS5zdGFydCkgPiAoZG91YmxlKShhW25leHRzdGFydF9pZHhdLmVuZCkpIHJldHVybiBmYWxzZTsKCQkJLy8gZG8gYWxsIGpvYiwgY2xlYXIgYlswXSBhbmQgYVswXQoJCQkvL2EuZXJhc2UoYS5iZWdpbigpKTtiLmVyYXNlKGIuYmVnaW4oKSk7CgkJCQoJCQkKCQkJaWYgKGk8Yi5zaXplKCktMSkKCQkJewoJCQkJbG9uZyBqPS0xLG1pbj0xMDAwMDA7CgkJCQlGUih2LGIuc2l6ZSgpLTEpCgkJCQl7CgkJCQkJaWYgKGJbdl0uc3RhcnQ8bWluICYmIHYhPWkgJiYgYlt2XS5zdGFydCkge2o9djttaW49Ylt2XS5zdGFydDt9CgkJCQl9CQoJCQkJaWYgKGo+LTEpCgkJCQlpZiAoYltqXS5zdGFydCA8PSAoZG91YmxlKWFbbmV4dHN0YXJ0X2lkeF0udy8oZG91YmxlKXNwZWVkICsgKGRvdWJsZSkoYVtuZXh0c3RhcnRfaWR4XS5zdGFydCkpCgkJCQkJewoJCQkJCQliW2pdLnN0YXJ0ID0gKGRvdWJsZSlhW25leHRzdGFydF9pZHhdLncvKGRvdWJsZSlzcGVlZCArIChkb3VibGUpKGFbbmV4dHN0YXJ0X2lkeF0uc3RhcnQpOwoJCQkJCQlhW2Jbal0uYV9pZHhdLnN0YXJ0ID0gKGRvdWJsZSlhW25leHRzdGFydF9pZHhdLncvKGRvdWJsZSlzcGVlZCArIChkb3VibGUpKGFbbmV4dHN0YXJ0X2lkeF0uc3RhcnQpOwoJCQkJCX0KCQkJfQoJCQlhW25leHRzdGFydF9pZHhdLmVuZD0wOyBhW25leHRzdGFydF9pZHhdLnN0YXJ0ID0gMDsKCQkJYltpXS5lbmQ9MDsgYltpXS5zdGFydD0wOwkJCQoJCQljb3VudCsrOwoJCQkvLyBjaGVjayBmYWxzZSBjYXNlCgkJCQoJCQljb250aW51ZTsKCQl9CgkJaWYgKGFbbmV4dHN0YXJ0X2lkeF0uZW5kID4gYVtuZXh0ZGVhZGxpbmVfaWR4XS5zdGFydCkKCQl7CgkJCWFbbmV4dHN0YXJ0X2lkeF0udyAtPSBzcGVlZCooYVtuZXh0ZGVhZGxpbmVfaWR4XS5zdGFydCAtIGFbbmV4dHN0YXJ0X2lkeF0uc3RhcnQpOwoJCQlpZiAoYVtuZXh0c3RhcnRfaWR4XS53IDw9MCkgCgkJCXsKCQkJCWFbbmV4dHN0YXJ0X2lkeF0uZW5kPTA7IGFbbmV4dHN0YXJ0X2lkeF0uc3RhcnQgPSAwOwoJCQkJYltuZXh0ZGVhZGxpbmVfaWR4XS5lbmQ9MDsgYltuZXh0ZGVhZGxpbmVfaWR4XS5zdGFydD0wOwoJCQkJY291bnQrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWFbbmV4dHN0YXJ0X2lkeF0uc3RhcnQgPSBhW25leHRkZWFkbGluZV9pZHhdLnN0YXJ0OwoJCQliW2ldLnN0YXJ0ID0gYVtuZXh0ZGVhZGxpbmVfaWR4XS5zdGFydDsKCQl9Cgl9CglyZXR1cm4gdHJ1ZTsKCn0KbG9uZyBsb25nIGZpbmQobG9uZyBsZWZ0LCBsb25nIHJpZ2h0KQp7CgliPXNhdmViO2E9c2F2ZWE7CglpZiAobGVmdD09cmlnaHQtMSkKCXsKCQkJaWYgKGNoZWNrKGxlZnQpKSByZXR1cm4gbGVmdDsKCQkJZWxzZSByZXR1cm4gcmlnaHQ7Cgl9Cglsb25nIG1pZCA9IChsZWZ0K3JpZ2h0KS8yOwoJaWYgKGNoZWNrKG1pZCkpIHJldHVybiBmaW5kKGxlZnQsbWlkKTsKCWVsc2UgcmV0dXJuIGZpbmQobWlkLHJpZ2h0KTsJCn0KCgp2b2lkIHByb2Nlc3MoKQp7Cglzb3J0KGEuYmVnaW4oKSxhLmVuZCgpLHNvcnRfYnlfb25lX2l0ZW0oKSk7CgliLmNsZWFyKCk7CglGUih2LE4pCgl7CgkJaXRlbSB0ZW1wID0gYVt2XTsKCQljb3BpdGVtIHRlbXAxOwoJCXRlbXAxLmVuZCA9IHRlbXAuZW5kOyB0ZW1wMS5zdGFydCA9IHRlbXAuc3RhcnQ7IHRlbXAxLmFfaWR4ID0gdjsKCQliLnB1c2hfYmFjayh0ZW1wMSk7Cgl9Cglzb3J0KGIuYmVnaW4oKSxiLmVuZCgpLHNvcnRfYnlfb25lX2NvcGl0ZW0oKSk7CglzYXZlYT1hO3NhdmViPWI7Cglsb25nIGxvbmcgdCA9IGZpbmQoMCwxMDAwMCk7CglwcmludGYoIiVkXG4iLHQpOwp9CmludCBtYWluICgpCnsKCXNjYW5mKCIlZCIsICZUKTsKCUZSKG8sVCkKCXsKCQlhLmNsZWFyKCk7CgkJc2NhbmYoIiVkIiwgJk4pOwoJCUZSKHYsTikKCQl7CgkJCWl0ZW0gdGVtcDsKCQkJc2NhbmYoIiVsZiVsZiVsZiIsICZ0ZW1wLnN0YXJ0LCZ0ZW1wLmVuZCwmdGVtcC53KTsKCQkJYS5wdXNoX2JhY2sodGVtcCk7CQkKCQl9CgkJcHJvY2VzcygpOwoJfQoJcmV0dXJuIDA7Cn0K
compilation info
prog.cpp:11: error: storage size of ‘s’ isn't known
prog.cpp:11: error: storage size of ‘d’ isn't known
prog.cpp:11: error: storage size of ‘w’ isn't known
prog.cpp: In function ‘bool check(long int)’:
prog.cpp:48: warning: comparison between signed and unsigned integer expressions
prog.cpp:69: warning: comparison between signed and unsigned integer expressions
prog.cpp:76: warning: comparison between signed and unsigned integer expressions
prog.cpp:79: warning: comparison between signed and unsigned integer expressions
prog.cpp: In function ‘void process()’:
prog.cpp:142: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long long int’
prog.cpp: In function ‘int main()’:
prog.cpp:146: warning: format ‘%d’ expects type ‘int*’, but argument 2 has type ‘long int*’
prog.cpp:150: warning: format ‘%d’ expects type ‘int*’, but argument 2 has type ‘long int*’
prog.cpp:146: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
prog.cpp:150: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
prog.cpp:154: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
stdout