Pku 3277 City Horizon
#include
<
iostream
>
#include < algorithm >
#include < cstdio >
#include < cstdlib >
#include < cstring >
using namespace std;
#define N 40001
#define max(a,b) ( (a)>(b)?(a):(b) )
int n,d[N << 1 ], idx[N << 1 ], pos, f[N << 1 ];
struct Node{
int x, y, ht;
Node( int a = 0 , int b = 0 , int c = 0 ):x(a), y(b), ht(c) {}
};
bool operator < ( Node const & a, Node const & b ){
return a.ht < b.ht; }
Node xyh[N];
int bsearch( int v ){
int left = 0 , right = n * 2 ;
while ( left + 1 < right ){
int m = (left + right) >> 1 ;
if ( d[m] > v ) right = m;
else if ( d[m] < v ) left = m;
else return idx[m];
}
return idx[left]; }
int tb[N * 8 ] = { 0 };
void insert( int l, int r, int a, int b, int rt, int h ){
if ( l == a && r == b ){
tb[rt] = max( tb[rt], h ); return ; }
if ( tb[rt] != 0 ){
tb[rt << 1 ] = tb[rt];
tb[(rt << 1 ) + 1 ] = tb[rt];
tb[rt] = 0 ; }
int m = (l + r) >> 1 ;
if ( b <= m ) insert( l, m, a, b, rt << 1 , h );
else if ( a >= m ) insert( m, r, a, b, (rt << 1 ) + 1 , h );
else {
insert( l, m, a, m, rt << 1 , h );
insert( m, r, m, b, (rt << 1 ) + 1 , h ); }
}
typedef __int64 INT;
INT ans;
void sum( int l, int r, int rt ){
if ( tb[rt] > 0 ){
ans = ans + (INT)( f[r] - f[l] ) * (INT)tb[rt];
return ; }
if ( r > l + 1 ){
int m = (l + r) >> 1 ;
sum( l, m, rt << 1 );
sum( m, r, (rt << 1 ) + 1 );
}
}
inline int read(){
char ch;
int d;
while ( (ch = getchar()), ch < ' 0 ' || ch > ' 9 ' );
d = ch - ' 0 ' ;
while ( (ch = getchar()), ch >= ' 0 ' && ch <= ' 9 ' ) d = d * 10 + ch - ' 0 ' ;
return d; }
int main(){
int a, b, h;
scanf( " %d " , & n);
for ( int i = 0 ; i < n; ++ i ){
a = read(), b = read(), h = read();
xyh[i] = Node( a, b, h );
d[i << 1 ] = a, d[(i << 1 ) + 1 ] = b; }
sort( d, d + n * 2 );
pos = 1 ; idx[ 0 ] = 1 ; f[ 1 ] = d[ 0 ];
for ( int i = 1 ; i < n * 2 ; ++ i ){
if ( d[i] != d[i - 1 ] ) idx[i] = ++ pos;
else idx[i] = idx[i - 1 ];
f[ idx[i] ] = d[i];
}
sort( xyh, xyh + n );
for ( int i = 0 ; i < n; ++ i ){
a = bsearch( xyh[i].x ), b = bsearch( xyh[i].y );
insert( 1 , pos, a, b, 1 , xyh[i].ht );
}
ans = 0 ;
sum( 1 , pos, 1 );
printf( " %I64d\n " , ans );
return 0 ;
}
#include < algorithm >
#include < cstdio >
#include < cstdlib >
#include < cstring >
using namespace std;
#define N 40001
#define max(a,b) ( (a)>(b)?(a):(b) )
int n,d[N << 1 ], idx[N << 1 ], pos, f[N << 1 ];
struct Node{
int x, y, ht;
Node( int a = 0 , int b = 0 , int c = 0 ):x(a), y(b), ht(c) {}
};
bool operator < ( Node const & a, Node const & b ){
return a.ht < b.ht; }
Node xyh[N];
int bsearch( int v ){
int left = 0 , right = n * 2 ;
while ( left + 1 < right ){
int m = (left + right) >> 1 ;
if ( d[m] > v ) right = m;
else if ( d[m] < v ) left = m;
else return idx[m];
}
return idx[left]; }
int tb[N * 8 ] = { 0 };
void insert( int l, int r, int a, int b, int rt, int h ){
if ( l == a && r == b ){
tb[rt] = max( tb[rt], h ); return ; }
if ( tb[rt] != 0 ){
tb[rt << 1 ] = tb[rt];
tb[(rt << 1 ) + 1 ] = tb[rt];
tb[rt] = 0 ; }
int m = (l + r) >> 1 ;
if ( b <= m ) insert( l, m, a, b, rt << 1 , h );
else if ( a >= m ) insert( m, r, a, b, (rt << 1 ) + 1 , h );
else {
insert( l, m, a, m, rt << 1 , h );
insert( m, r, m, b, (rt << 1 ) + 1 , h ); }
}
typedef __int64 INT;
INT ans;
void sum( int l, int r, int rt ){
if ( tb[rt] > 0 ){
ans = ans + (INT)( f[r] - f[l] ) * (INT)tb[rt];
return ; }
if ( r > l + 1 ){
int m = (l + r) >> 1 ;
sum( l, m, rt << 1 );
sum( m, r, (rt << 1 ) + 1 );
}
}
inline int read(){
char ch;
int d;
while ( (ch = getchar()), ch < ' 0 ' || ch > ' 9 ' );
d = ch - ' 0 ' ;
while ( (ch = getchar()), ch >= ' 0 ' && ch <= ' 9 ' ) d = d * 10 + ch - ' 0 ' ;
return d; }
int main(){
int a, b, h;
scanf( " %d " , & n);
for ( int i = 0 ; i < n; ++ i ){
a = read(), b = read(), h = read();
xyh[i] = Node( a, b, h );
d[i << 1 ] = a, d[(i << 1 ) + 1 ] = b; }
sort( d, d + n * 2 );
pos = 1 ; idx[ 0 ] = 1 ; f[ 1 ] = d[ 0 ];
for ( int i = 1 ; i < n * 2 ; ++ i ){
if ( d[i] != d[i - 1 ] ) idx[i] = ++ pos;
else idx[i] = idx[i - 1 ];
f[ idx[i] ] = d[i];
}
sort( xyh, xyh + n );
for ( int i = 0 ; i < n; ++ i ){
a = bsearch( xyh[i].x ), b = bsearch( xyh[i].y );
insert( 1 , pos, a, b, 1 , xyh[i].ht );
}
ans = 0 ;
sum( 1 , pos, 1 );
printf( " %I64d\n " , ans );
return 0 ;
}