poj 2528 Mayor's posters 简单离散化+线段树

来源:互联网 发布:天池大数据竞赛官网 编辑:程序博客网 时间:2024/04/30 02:35


#include <map>#include <set>#include <queue>#include <stack>#include <vector>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1#define pi acos(-1.0)#define eps 1e-8typedef long long ll;const int inf = 0x3f3f3f3f;const int N = 20010;struct node{int l, r;int x;}tr[N * 4];struct y{int l, r;}p[N];int cnt, ans;int vis[N], t[N];void init( ){ans = cnt = 0;memset( vis, 0, sizeof(vis) );}int b_sch( int pos ){int l = 1, mid, r = cnt;while( l <= r ){//cout << "fwarfaer" << endl;mid = ( l + r ) >> 1;if( t[mid] > pos )r = mid - 1;else if( t[mid] < pos )l = mid + 1;elsebreak;}return mid;}void build ( int l, int r, int rt ){tr[rt].l = l;tr[rt].r = r;tr[rt].x = 0;if( l == r )return;int mid = ( l + r ) >> 1;build( lson );build( rson );}void update( int l, int r, int rt, int col ){if( l <= tr[rt].l && tr[rt].r <= r ){tr[rt].x = col;return;}if( tr[rt].x ){tr[rt<<1].x = tr[rt].x;tr[rt<<1|1].x = tr[rt].x;tr[rt].x = 0;}int mid = (tr[rt].l + tr[rt].r ) >> 1;if( r <= mid )update( l, r, rt<<1, col );else if( l > mid )update( l, r, rt<<1|1, col );else{update( lson, col );update( rson, col );}}void query( int rt ){if( tr[rt].x ){if( !vis[ tr[rt].x ] ){vis[ tr[rt].x ] = 1;ans++;}return;}query( rt << 1 );query( rt << 1 | 1 );}int main(){int tot;scanf("%d", &tot);while( tot-- ){init();int n;scanf("%d", &n);for( int i = 1; i <= n; i++ ){scanf("%d%d", &p[i].l, &p[i].r);t[++cnt] = p[i].l, t[++cnt] = p[i].r;}sort( t + 1, t + cnt + 1 );cnt = unique( t + 1, t + 1 + cnt ) - t - 1;//cout << cnt << endl;build( 1, cnt, 1 );for( int i = 1; i <= n; i++ ){int l = b_sch( p[i].l );int r = b_sch( p[i].r );//cout << l << " " << r << endl;update( l, r, 1, i );}query( 1 );printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击