• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            coreBugZJ

            此 blog 已棄。

            買票問(wèn)題,福州大學(xué)第八屆程序設(shè)計(jì)競(jìng)賽 之 D,F(xiàn)ZU 2029

            Problem 2029 買票問(wèn)題

            Accept: 8 Submit: 56
            Time Limit: 5000 mSec Memory Limit : 32768 KB

             Problem Description

            過(guò)年回家買票又排起了長(zhǎng)隊(duì)。剛開(kāi)始隊(duì)列為空的。 有四種情況: 1.隊(duì)尾加進(jìn)了一個(gè)編號(hào)為a,忍耐度為 b 的人,所有人的編號(hào)都不同。 2.隊(duì)首的人買完票走了。 3.隊(duì)列中忍耐度最低的人離開(kāi)了隊(duì)列。 4.在隊(duì)伍變化的過(guò)程中,編號(hào)為x的人想知道他前面有多少人,如果人數(shù)大于 y 則他離開(kāi)隊(duì)伍。 所有人的編號(hào)和忍耐度都是一個(gè)整數(shù)(保證可以使用有符號(hào)32位整型保存),且都是唯一的。

             Input

            輸入數(shù)據(jù)包含多組測(cè)試數(shù)據(jù)輸入數(shù)據(jù)第一行T表示操作的個(gè)數(shù)。(T <= 100000) 接著T行, add a b 表示隊(duì)伍尾加入 編號(hào)a忍耐度b的人(a,b保證可以使用有符號(hào)32位整型保存) pop 隊(duì)首的人買完票走了,如果隊(duì)列為空則不執(zhí)行此操作。 leave 隊(duì)列中忍耐度最低的人離開(kāi)了隊(duì)列,如果隊(duì)列為空則不執(zhí)行此操作。 check x y在隊(duì)伍變化的過(guò)程中,編號(hào)為x的人想知道他前面有多少人,如果人數(shù)大于 y 則他離開(kāi)隊(duì)伍,如果隊(duì)列不含編號(hào)為x的人不執(zhí)行此操作。(x,y保證可以使用有符號(hào)32位整型保存)

             Output

            對(duì)于第四種操作 輸出編號(hào)為x的人前面的人數(shù)。

             Sample Input

            10
            add 5 1
            add 4 2
            add 3 3
            add 2 4
            add 1 5
            check 2 5
            leave
            check 2 1
            pop
            check 1 5

             Sample Output

            3
            2
            1

             



            小根堆求最小值,樹狀數(shù)組求個(gè)數(shù),map 求映射(注意加注釋的幾個(gè)erase,沒(méi)有就超時(shí),鄙視卡常數(shù)的?。。。。?。



              1#include <iostream>
              2#include <cstdio>
              3#include <vector>
              4#include <queue>
              5#include <cstring>
              6#include <map>
              7
              8using namespace std;
              9
             10const int T = 100009;
             11
             12struct  Peo
             13{
             14        Peo( int _a=0int _b=0int _q=0 ) : a(_a), b(_b), q(_q) {}
             15        int  a, b, q;
             16}
            ;
             17
             18class MinCmp
             19{
             20public : 
             21        bool operator()( const Peo &a, const Peo &b );
             22}
            ;
             23bool MinCmp::operator()( const Peo &a, const Peo &b ) {
             24        return a.b > b.b;
             25}

             26
             27int qh, qt, inq[ T ], sq[ T ], q2a[ T ];
             28map< intint > a2q;
             29priority_queue< Peo, vector< Peo >, MinCmp > heap;
             30
             31#define lowbit(i)  (i&((i-1)^i))
             32
             33void st_add( int i, int delta ) {
             34        while ( i < T ) {
             35                sq[ i ] += delta;
             36                i += lowbit(i);
             37        }

             38}

             39
             40int st_sum( int i ) {
             41        int s = 0;
             42        while ( i > 0 ) {
             43                s += sq[ i ];
             44                i -= lowbit( i );
             45        }

             46        return s;
             47}

             48
             49void init() {
             50        while ( ! heap.empty() ) {
             51                heap.pop();
             52        }

             53        qh = qt = 1;
             54        a2q.clear();
             55        memset( inq, 0sizeof(inq) );
             56        memset( sq,  0sizeof(sq)  );
             57}

             58
             59void add( int a, int b ) {
             60        a2q[ a ] = qt;
             61        q2a[ qt ] = a;
             62        heap.push( Peo( a, b, qt ) );
             63        inq[ qt ] = 1;
             64        st_add( qt, 1 );
             65        ++qt;
             66}

             67
             68void pop() {
             69        while ( (qh<qt) && (inq[qh]==0) ) {
             70                ++qh;
             71        }

             72        if ( qh < qt ) {
             73                inq[ qh ] = 0;
             74                a2q.erase( q2a[ qh ] );////////////////////////////
             75                st_add( qh, -1 );
             76                ++qh;
             77        }

             78}

             79
             80void leave() {
             81        Peo p;
             82        while ( (!heap.empty()) && (inq[heap.top().q]==0) ) {
             83                heap.pop();
             84        }

             85        if ( !heap.empty() ) {
             86                p = heap.top();
             87                inq[ p.q ] = 0;
             88                st_add( p.q, -1 );
             89                a2q.erase( q2a[ p.q ] );/////////////////////////////////
             90        }

             91}

             92
             93void check( int x, int y ) {
             94        map< intint >::iterator  ite = a2q.find( x );
             95        if ( ite != a2q.end() ) {
             96                int q = ite->second;
             97                int s = st_sum( q ) - 1;
             98                printf( "%d\n", s );
             99                if ( s > y ) {
            100                        inq[ q ] = 0;
            101                        st_add( q, -1 );
            102                        a2q.erase( ite );////////////////////////////
            103                }

            104        }

            105}

            106
            107int main() {
            108        int t, a, b;
            109        char cmd[ 100 ];
            110        while ( scanf( "%d"&t ) == 1 ) {
            111                init();
            112                while ( t-- > 0 ) {
            113                        scanf( "%s", cmd );
            114                        if ( cmd[ 0 ] == 'a' ) {
            115                                scanf( "%d%d"&a, &b );
            116                                add( a, b );
            117                        }

            118                        else if ( cmd[ 0 ] == 'p' ) {
            119                                pop();
            120                        }

            121                        else if ( cmd[ 0 ] == 'l' ) {
            122                                leave();
            123                        }

            124                        else if ( cmd[ 0 ] == 'c' ) {
            125                                scanf( "%d%d"&a, &b );
            126                                check( a, b );
            127                        }

            128                }

            129        }

            130        return 0;
            131}

            132

            posted on 2011-04-30 23:34 coreBugZJ 閱讀(621) 評(píng)論(1)  編輯 收藏 引用 所屬分類: ACM

            Feedback

            # re: 買票問(wèn)題,福州大學(xué)第八屆程序設(shè)計(jì)競(jìng)賽 之 D,F(xiàn)ZU 2029 2011-05-03 01:26 lijunle

            這題可以用線段樹做,代碼量很大,但是需時(shí)會(huì)降低。

            另外,我想問(wèn)一下這場(chǎng)的《計(jì)數(shù)問(wèn)題》怎么做?
            http://acm.fzu.edu.cn/problem.php?pid=2031

            如果方便,請(qǐng)通過(guò)郵件告訴我。謝謝。  回復(fù)  更多評(píng)論   


            亚洲va久久久噜噜噜久久| 人妻无码久久精品| 久久久久波多野结衣高潮| 精品久久久久久久中文字幕 | 精品久久人人爽天天玩人人妻| 女人香蕉久久**毛片精品| 精品久久久久成人码免费动漫| 久久99精品国产自在现线小黄鸭| 国产女人aaa级久久久级| 久久精品国产清高在天天线| 亚洲精品乱码久久久久久不卡| 久久精品国产99国产精品澳门| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久久女人精品毛片| 久久久精品人妻无码专区不卡 | 怡红院日本一道日本久久| 香蕉久久夜色精品国产尤物| 亚洲AV无码久久精品狠狠爱浪潮| 欧美日韩中文字幕久久伊人| 亚洲国产美女精品久久久久∴| 久久99精品国产麻豆蜜芽| 精品久久久久香蕉网| 久久人人爽人人爽人人片AV高清 | 99国产精品久久| 国产精品一久久香蕉产线看| 香蕉久久夜色精品国产2020| 99久久成人18免费网站| 国产成人精品久久一区二区三区av | 亚洲午夜精品久久久久久人妖| 一级做a爱片久久毛片| 久久久久久无码Av成人影院 | 91精品国产综合久久久久久| 东方aⅴ免费观看久久av| 久久亚洲精品成人AV| 亚洲欧美伊人久久综合一区二区| 精品久久久久久国产牛牛app | 亚洲综合熟女久久久30p| 中文字幕久久亚洲一区| 一本一本久久a久久精品综合麻豆| 久久亚洲国产成人精品无码区| 日韩美女18网站久久精品|