标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 45703 | Accepted: 13239 |
Description
Input
Output
Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
用 col[rt] 来记录如今是什么颜色, -1 表示这个区间有多个颜色
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <map> #include <set> #include <stack> #include <algorithm> using namespace std; #define root 1,n,1 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define lr rt<<1 #define rr rt<<1|1 typedef long long LL; const int oo = 1e9+7; const double PI = acos(-1.0); const double eps = 1e-6 ; const int N = 20010; const int mod = 2333333; int n , m ; LL col[N<<2] , tot ; bool tag[N<<2] ; void Down( int l , int r , int rt ) { if( col[rt] != -1 ) col[lr] = col[rr] = col[rt] ; } void Up( int rt ){ if( col[lr] == col[rr] && col[lr] != -1 ) col[rt] = col[lr]; else col[rt] = -1 ; } void build( int l , int r , int rt ){ col[rt] = -1 ; if( l == r ) return ; int mid = (l+r)>>1; build(lson),build(rson); } void update( int l , int r , int rt , int L , int R , int c ) { // cout << L <<‘ ‘ << R << ‘ ‘ << l << ‘ ‘ << r << endl ; if( L == l && r == R ) { col[rt] = c ; return ; } if( col[rt] == c ) return ; else Down( l,r,rt ) , col[rt] = -1 ; int mid = (l+r)>>1; if( R <= mid ) update(lson,L,R,c); else if( L > mid ) update(rson,L,R,c); else update(lson,L,mid,c) , update(rson,mid+1,R,c); Up(rt); } LL query( int l , int r , int rt , int x ) { if( col[rt] != -1 ) return col[rt]; Down(l,r,rt); int mid = (l+r)>>1; if( x <= mid ) return query(lson,x); else return query(rson,x); } struct node { int num , new_num , id ; }e[N]; bool cmp1( const node &a , const node &b ) { return a.num < b.num ; } bool cmp2( const node &a , const node &b ) { return a.id < b.id ; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); #endif // LOCAL int _ ; scanf("%d",&_); while( _-- ) { memset( tag , false , sizeof tag ); tot = 0 ; scanf("%d",&n); for( int i = 0 ; i < n ; ++i ) { scanf("%d",&e[tot].num); e[tot].id = tot ; tot++; scanf("%d",&e[tot].num); e[tot].id = tot ; tot++; } sort( e , e + tot , cmp1 ); e[0].new_num = 1 ; for( int i = 1 ; i < tot ; ++i ) e[i].new_num = (e[i].num == e[i-1].num?e[i-1].new_num:e[i-1].new_num+1); sort( e , e + tot , cmp2 ); n = tot+10; build(root); for( int i = 0 ; i < tot ; i+=2 ){ // cout << e[i].new_num << ‘ ‘ << e[i+1].new_num << endl ; update(root,e[i].new_num,e[i+1].new_num,i+1); } // cout << "ok" << endl ; for( int i = 1 ; i <= n ; ++i ) { // cout << query(root,i) << endl ; int color = query(root,i) ; if( color == -1 ) continue ; tag[color] = true ; } int ans = 0 ; for( int i = 1 ; i <= n ; ++i ) if(tag[i]) ans++; printf("%d\n",ans); } }
POJ 2528 Mayor's posters(线段树,区间覆盖,单点查询)
标签:
原文地址:http://www.cnblogs.com/hlmark/p/4248098.html