| ||||||||||
| 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 | |||||||||
《相信很多人都过不了这组数据吧》的答案应该是2、2、4可能是他们理解错题目了,这里每个poster是占一个点的,不是占一个线段,所以答案应该是2、2、4,附上我的代码,注意我的线段树的叶子节点是left == right,是一个点而不是一个元线段!
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
struct Segment{
int l, r;
};
//完全二叉树
int segTree[70000];
Segment seg[10001];
int pt[20002];
int len;
int n;
bool flag[20010];
void insert( int idx, int left, int right, int a, int b, int color ){
if( segTree[idx] != color ){
if( left == a && right == b ){
segTree[idx] = color;
}else{
int mid = ( left + right ) >> 1;
if( segTree[idx] >= 0 ){
segTree[ idx<<1 ] = segTree[idx];
segTree[(idx<<1)+1] = segTree[idx];
segTree[idx] = -1;
}
if( b <= mid ){
insert( idx << 1, left, mid, a, b, color );
}else if( a > mid ){
insert( ( idx << 1 ) + 1, mid+1, right, a, b, color );
}else{
insert( idx << 1, left, mid, a, mid, color );
insert( ( idx << 1 ) + 1, mid+1, right, mid+1, b, color );
}
}
}
}
void scount( int idx, int left, int right ){
if( segTree[idx] >= 0 ){
flag[segTree[idx]] = true;
}else{
if( right != left ){ //not leaf node
int mid = ( left + right ) >> 1;
scount( idx << 1, left, mid );
scount( ( idx << 1 ) + 1, mid+1, right );
}
}
}
int main(){
int T;
bitset<10000001> bs;
scanf( "%d", &T );
while(T--){
scanf( "%d", &n );
memset( segTree, 0, sizeof( segTree ) );
len = 0;
for( int i=0; i<n; ++i ){
scanf( "%d%d", &seg[i].l, &seg[i].r );
if( !bs.test( seg[i].l ) ){
pt[len++] = seg[i].l;
bs.set( seg[i].l );
}
if( !bs.test( seg[i].r ) ){
pt[len++] = seg[i].r ;
bs.set( seg[i].r );
}
}
sort( pt, pt+len );
for( int i=0; i<len; ++i ){ // clear
bs.reset( pt[i] );
}
int nl,nr;
for( int i=0; i<n; ++i ){
nl = lower_bound( pt, pt+len, seg[i].l ) - pt;
nr = lower_bound( pt, pt+len, seg[i].r ) - pt;
insert( 1, 0, len-1, nl, nr, i+1 );
}
memset( flag, 0, len+1 );
scount( 1, 0, len-1 );
int res = 0;
for( int i=1; i<=len; ++i ){
if( flag[i] )
++res;
}
printf( "%d\n", res );
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator