BZOJ-3290: Theresa與數(shù)據(jù)結(jié)構(gòu)(CDQ分治+二維線段樹)

題目:http://www.lydsy.com/JudgeOnline/problem.php?id=3290

首先這題不帶修改很好做,按z離散化一下佑颇,然后掃一遍奸绷,弄個(gè)二維的動(dòng)態(tài)線段樹維護(hù)即可刃唐,然后因?yàn)橛辛诵薷牟僮骼疑耄允褂肅DQ分治來轉(zhuǎn)離線减宣,多付出一個(gè)log n代價(jià),所以總復(fù)雜度是O(n log^3 n)

代碼(AC的CDQ分治第一題好開心号杠!其實(shí)神級(jí)分治挺容易的蚪腋?):

#include <cstdio>

#include <algorithm>

#include <cstring>

  

using namespace std ;

  

const int maxv = 35000000 ;

const int maxn = 101000 ;

const int maxV = 1500000 ;

  

struct SORT {

    int a[ maxn << 1 ] , b[ maxn << 1 ] , n , m ;

    SORT(  ) {

        n = m = 0 ;

    }

    inline void add( int x ) {

        a[ ++ n ] = x ;

    }

    inline void solve(  ) {

        sort( a + 1 , a + n + 1 ) ; m = 0 ;

        for ( int i = 0 ; i ++ < n ; ) {

            if ( i == 1 || a[ i ] != a[ i - 1 ] ) b[ ++ m ] = a[ i ] ;

        }

    }

    inline int getpos( int x ) {

        if ( x == b[ 1 ] ) return 1 ;

        if ( x == b[ m ] ) return m ;

        int l = 1 , r = m , mid ;

        while ( r - l > 1 ) {

            mid = ( l + r ) >> 1 ;

            if ( b[ mid ] == x ) return mid ;

            if ( x < b[ mid ] ) r = mid ; else l = mid ;

        }

    }

} Px , Py ;

  

struct node {

    node *lc , *rc ;

    int sum ;

} sgt[ maxv ] ;

  

node *pt ;

  

inline void Init_sgt(  ) {

    pt = sgt ;

}

  

void change( int x , int y , int l , int r , node* &t ) {

    if ( ! t ) {

        t = pt ++ ; 

        t -> lc = t -> rc = NULL , t -> sum = 0 ;

    }

    t -> sum += y ;

    if ( l == r ) return ;

    int mid = ( l + r ) >> 1 ;

    if ( x <= mid ) change( x , y , l , mid , t -> lc ) ; else

    change( x , y , mid + 1 , r , t -> rc ) ;

}

  

int query( int l , int r , int _l , int _r , node *t ) {

    if ( ! t ) return 0 ;

    if ( l == _l && r == _r ) return t -> sum ;

    int mid = ( _l + _r ) >> 1 ;

    if ( r <= mid )  return query( l , r , _l , mid , t -> lc ) ;

    if ( l > mid ) return query( l , r , mid + 1 , _r , t -> rc ) ;

    return query( l , mid , _l , mid , t -> lc ) + query( mid + 1 , r , mid + 1 , _r , t -> rc ) ;

}

  

struct Node {

    Node *lc , *rc ;

    node *t ; 

} Sgt[ maxV ] ;

  

Node *Root , *Pt ;

  

inline void Init_Sgt(  ) {

    Root = NULL , Pt = Sgt ;

}

  

void Change( int px , int py , int v , int l , int r , Node* &t ) {

    if ( ! t ) {

        t = Pt ++ ;

        t -> lc = t -> rc = NULL , t -> t = NULL ;

    }

    change( py , v , 1 , Py.m , t -> t ) ;

    if ( l == r ) return ;

    int mid = ( l + r ) >> 1 ;

    if ( px <= mid ) Change( px , py , v , l , mid , t -> lc ) ; else

    Change( px , py , v , mid + 1 , r , t -> rc ) ;

}

  

int Query( int lx , int rx , int ly , int ry , int _l , int _r , Node *t ) {

    if ( ! t ) return 0 ;

    if ( lx == _l && rx == _r ) return query( ly , ry , 1 , Py.m , t -> t ) ;

    int mid = ( _l + _r ) >> 1 ;

    if ( rx <= mid ) return Query( lx , rx , ly , ry , _l , mid , t -> lc ) ;

    if ( lx > mid ) return Query( lx , rx , ly , ry , mid + 1 , _r , t -> rc ) ;

    return Query( lx , mid , ly , ry , _l , mid , t -> lc ) + Query( mid + 1 , rx , ly , ry , mid + 1 , _r , t -> rc ) ;

}

  

struct seg {

    int lx , rx , ly , ry , z , t , x ;

    inline void oper( int _lx , int _rx , int _ly , int _ry , int _z , int _t , int _x ) {

        lx = _lx , rx = _rx , ly = _ly , ry = _ry , z = _z , t = _t , x = _x ;

    }

    bool operator < ( const seg &S ) const {

        return z < S.z ;

    }

} s[ maxn << 1 ] ;

  

int n , q , a[ maxn ][ 5 ] , sta[ maxn ] , tp = 0 , ans[ maxn ] ;

  

struct point {

    int x , y , z , v ;

    inline void oper( int _x , int _y , int _z , int _v ) {

        x = _x , y = _y , z = _z , v = _v ;

    }

    bool operator < ( const point &P ) const {

        return z < P.z ;

    }

} p[ maxn ] ;

  

int pn , sn ;

  

void solve( int l , int r ) {

    if ( l == r ) return ;

    int mid = ( l + r ) >> 1 ; pn = sn = 0 ;

    for ( int i = l ; i <= mid ; ++ i ) if ( ! a[ i ][ 0 ] ) {

        p[ ++ pn ].oper( a[ i ][ 1 ] , a[ i ][ 2 ] , a[ i ][ 3 ] , a[ i ][ 4 ] ) ;

    }

    for ( int i = mid + 1 ; i <= r ; ++ i ) if ( a[ i ][ 0 ] ) {

        s[ ++ sn ].oper( a[ i ][ 1 ] , a[ i ][ 1 ] + a[ i ][ 4 ] , a[ i ][ 2 ] , a[ i ][ 2 ] + a[ i ][ 4 ] , a[ i ][ 3 ] - 1 , i , -1 ) ;

        s[ ++ sn ].oper( a[ i ][ 1 ] , a[ i ][ 1 ] + a[ i ][ 4 ] , a[ i ][ 2 ] , a[ i ][ 2 ] + a[ i ][ 4 ] , a[ i ][ 3 ] + a[ i ][ 4 ] , i , 1 ) ;

    }

    sort( p + 1 , p + pn + 1 ) , sort( s + 1 , s + sn + 1 ) ;

    int x = 1 ;

    Init_sgt(  ) , Init_Sgt(  ) ;

    for ( int i = 0 ; i ++ < sn ; ) {

        for ( ; x <= pn && p[ x ].z <= s[ i ].z ; ++ x ) {

            Change( Px.getpos( p[ x ].x ) , Py.getpos( p[ x ].y ) , p[ x ].v , 1 , Px.m , Root ) ;

        }

        ans[ s[ i ].t ] += ( s[ i ].x * Query( Px.getpos( s[ i ].lx ) , Px.getpos( s[ i ].rx ) , Py.getpos( s[ i ].ly ) , Py.getpos( s[ i ].ry ) , 1 , Px.m , Root ) ) ;

    }

    solve( l , mid ) , solve( mid + 1 , r ) ;

}

  

int main(  ) {

    scanf( "%d" , &n ) ;

    for ( int i = 0 ; i ++ < n ; ) {

        scanf( "%d%d%d" , &a[ i ][ 1 ] , &a[ i ][ 2 ] , &a[ i ][ 3 ] ) ;

        a[ i ][ 0 ] = 0 , a[ i ][ 4 ] = 1 ;

    }

    scanf( "%d" , &q ) ;

    char s[ 10 ] ;

    for ( int i = n + 1 ; i <= ( n + q ) ; ++ i ) {

        scanf( "%s" , s ) ;

        if ( s[ 0 ] == 'A' ) {

            a[ i ][ 0 ] = 0 , sta[ ++ tp ] = i ;

            scanf( "%d%d%d" , &a[ i ][ 1 ] , &a[ i ][ 2 ] , &a[ i ][ 3 ] ) ;

            a[ i ][ 4 ] = 1 ;

        } else if ( s[ 0 ] == 'C' ) {

            int now = sta[ tp -- ] ;

            a[ i ][ 0 ] = 0 , a[ i ][ 1 ] = a[ now ][ 1 ] , a[ i ][ 2 ] = a[ now ][ 2 ] , a[ i ][ 3 ] = a[ now ][ 3 ] , a[ i ][ 4 ] = -1 ;

        } else {

            a[ i ][ 0 ] = 1 ;

            scanf( "%d%d%d%d" , &a[ i ][ 1 ] , &a[ i ][ 2 ] , &a[ i ][ 3 ] , &a[ i ][ 4 ] ) ;

        }

    }

    n += q ;

    for ( int i = 0 ; i ++ < n ; ) if ( ! a[ i ][ 0 ] ) {

        Px.add( a[ i ][ 1 ] ) , Py.add( a[ i ][ 2 ] ) ;

    } else {

        Px.add( a[ i ][ 1 ] ) , Px.add( a[ i ][ 1 ] + a[ i ][ 4 ] ) ;

        Py.add( a[ i ][ 2 ] ) , Py.add( a[ i ][ 2 ] + a[ i ][ 4 ] ) ;

    }

    Px.solve(  ) , Py.solve(  ) ;

    memset( ans , 0 , sizeof( ans ) ) ;

    solve( 1 , n ) ;

    for ( int i = 0 ; i ++ < n ; ) if ( a[ i ][ 0 ] ) printf( "%d\n" , ans[ i ] ) ;

    return 0 ;

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姨蟋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立帖,老刑警劉巖眼溶,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晓勇,居然都是意外死亡堂飞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門绑咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绰筛,“玉大人,你說我怎么就攤上這事描融÷霖” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵窿克,是天一觀的道長(zhǎng)骏庸。 經(jīng)常有香客問我,道長(zhǎng)年叮,這世上最難降的妖魔是什么具被? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮只损,結(jié)果婚禮上一姿,老公的妹妹穿的比我還像新娘。我一直安慰自己跃惫,他們只是感情好叮叹,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辈挂,像睡著了一般衬横。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上终蒂,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天蜂林,我揣著相機(jī)與錄音遥诉,去河邊找鬼。 笑死噪叙,一個(gè)胖子當(dāng)著我的面吹牛矮锈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睁蕾,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼苞笨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了子眶?” 一聲冷哼從身側(cè)響起瀑凝,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臭杰,沒想到半個(gè)月后粤咪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渴杆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年寥枝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磁奖。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囊拜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出比搭,到底是詐尸還是另有隱情冠跷,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布敢辩,位于F島的核電站蔽莱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戚长。R本人自食惡果不足惜盗冷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望同廉。 院中可真熱鬧仪糖,春花似錦、人聲如沸迫肖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟆湖。三九已至故爵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隅津,已是汗流浹背诬垂。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工劲室, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人结窘。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓很洋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親隧枫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喉磁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容