当前位置: 代码迷 >> 综合 >> HDU 4268 树状数组 2012长春网络赛
  详细解决方案

HDU 4268 树状数组 2012长春网络赛

热度:12   发布时间:2024-01-20 20:16:07.0

这题呢.. 以前也做过其中的一小部分。只是综合起来就不会了!

我会变得强大的!

思路很巧妙!加油!以后要多做做这种题目!

#include<iostream>
#include<algorithm>
#define MN 111111
using namespace std;struct Node
{int h,w,id;
}node[MN<<1];int tree[MN<<1],tot,N;
int lowbit( int x ){	return x&-x; }bool cmpw( Node a,Node b )
{return a.w<b.w;
}bool cmp( Node a,Node b )
{if( a.h!=b.h )	return a.h<b.h;if( a.w!=b.w ) return a.w<b.w;return a.id>b.id;
}void lisan()
{int temp=111111111;tot=0;for( int i=0;i<2*N;i++ ){if( node[i].w!=temp ){temp=node[i].w;node[i].w=++tot;}elsenode[i].w=tot;}
}int find( int x )
{int ret=0;while( x ){ret+=tree[x];x-=lowbit(x);}return ret;
}int bsearch( int x )
{int l=1,r=tot,m;while( (m=(l+r)/2),l<r ){if( find(m)>=x )r=m;elsel=m+1;}return m;
}void update( int x,int v )
{while( x<=tot ){tree[x]+=v;x+=lowbit(x);}
}int main()
{int T;scanf( "%d",&T );while( T-- ){memset( tree,0,sizeof(tree) );scanf( "%d",&N );for( int i=0;i<N;i++ ){scanf( "%d %d",&node[i].h,&node[i].w );node[i].id=0;}for( int i=N;i<2*N;i++ ){scanf( "%d %d",&node[i].h,&node[i].w );node[i].id=1;}sort( node,node+2*N,cmpw );lisan();sort( node,node+2*N,cmp );int ans=0,k;for( int i=0;i<2*N;i++ ){if( node[i].id==1 )update(node[i].w,+1);else{ k=find(node[i].w);if( k==0 )continue;int at=bsearch(k);update(at,-1);ans++;}}printf( "%d\n",ans );}return 0;
}