Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
USACO的数据都过了,难道POJ加了数据。。。WAing。。。#include <iostream> #include <algorithm> using namespace std; const int SIZE = 40002; int pos[SIZE * 2], n, tmp[SIZE * 2]; typedef struct node { int s, e; int h; node() { s = e = h = 0; } }Node; Node points[SIZE]; class SegmentTree { public: Node nodes[SIZE * 6]; public: void buildtree( int, int, int ); void update( int, int, int, int ); __int64 getresult( int, int, int, int ); }; void SegmentTree::buildtree( int root, int s, int e ) { nodes[root].s = s; nodes[root].e = e; nodes[root].h = 0; if( e - s > 1 ) { int mid = ( s + e ) / 2; buildtree( root * 2, s, mid ); buildtree( root * 2 + 1, mid, e ); } } void SegmentTree::update( int root, int s, int e, int h ) { if( nodes[root].h > h ) return; if( s <= nodes[root].s && nodes[root].e <= e ) { nodes[root].h = h; return; } if( nodes[root].e - nodes[root].s == 1 ) return; int mid = ( nodes[root].s + nodes[root].e ) / 2; if( s < mid ) update( root * 2, s, e, h ); if( mid < e ) update( root * 2 + 1, s, e, h ); } __int64 SegmentTree::getresult( int root, int s, int e, int maxv ) { if( maxv < nodes[root].h ) maxv = nodes[root].h; if( nodes[root].e - nodes[root].s == 1 ) return (__int64) maxv * ( pos[nodes[root].e] - pos[nodes[root].s] ); __int64 r = 0; int mid = ( nodes[root].s + nodes[root].e ) / 2; if( mid <= s ) r += getresult( root * 2 + 1, s, e, maxv ); else if( mid >= e ) r += getresult( root * 2, s, e, maxv ); else { r += getresult( root * 2, s, mid, maxv ); r += getresult( root * 2 + 1, mid, e, maxv ); } return r; } int find( int n, int v ) { int low = 1, high = n, mid; while( low < high ) { mid = ( low + high ) / 2; if( pos[mid] < v ) low = mid + 1; else high = mid; } return high; } SegmentTree tree; int main() { int num = 1, i, count; scanf( "%d", &n ); for( i = 1; i <= n; i++ ) { scanf( "%d%d%d", &points[i].s, &points[i].e, &points[i].h ); tmp[num++] = points[i].s; tmp[num++] = points[i].e; } num--; sort( tmp + 1, tmp + 1 + num ); pos[1] = tmp[1]; for( i = count = 2; i <= num; i++ ) { if( tmp[i] != tmp[i - 1] ) pos[count++] = tmp[i]; } count--; tree.buildtree( 1, 1, count ); for( i = 1; i <= n; i++ ) { int l = find( count, points[i].s ); int r = find( count, points[i].e ); tree.update( 1, l, r, points[i].h ); } printf( "%I64d\n", tree.getresult( 1, 1, count, 0 ) ); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator