• <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>

            ACM___________________________

            ______________白白の屋
            posts - 182, comments - 102, trackbacks - 0, articles - 0
            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            常用鏈接

            留言簿(24)

            隨筆分類(332)

            隨筆檔案(182)

            FRIENDS

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜


            MiYu原創(chuàng), 轉(zhuǎn)帖請注明 : 轉(zhuǎn)載自 ______________白白の屋    

             

            題目地址:

             http://acm.hdu.edu.cn/showproblem.php?pid=2795

            題目描述:

            Billboard

            Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
            Total Submission(s): 733    Accepted Submission(s): 340


            Problem Description
            At the entrance to the university, there is a huge rectangular billboard of size h*w (h is its height and w is its width). The board is the place where all possible announcements are posted: nearest programming competitions, changes in the dining room menu, and other important information.

            On September 1, the billboard was empty. One by one, the announcements started being put on the billboard.

            Each announcement is a stripe of paper of unit height. More specifically, the i-th announcement is a rectangle of size 1 * wi.

            When someone puts a new announcement on the billboard, she would always choose the topmost possible position for the announcement. Among all possible topmost positions she would always choose the leftmost one.

            If there is no valid location for a new announcement, it is not put on the billboard (that's why some programming contests have no participants from this university).

            Given the sizes of the billboard and the announcements, your task is to find the numbers of rows in which the announcements are placed.
             

            Input
            There are multiple cases (no more than 40 cases).

            The first line of the input file contains three integer numbers, h, w, and n (1 <= h,w <= 10^9; 1 <= n <= 200,000) - the dimensions of the billboard and the number of announcements.

            Each of the next n lines contains an integer number wi (1 <= wi <= 10^9) - the width of i-th announcement.
             

            Output
            For each announcement (in the order they are given in the input file) output one number - the number of the row in which this announcement is placed. Rows are numbered from 1 to h, starting with the top row. If an announcement can't be put on the billboard, output "-1" for this announcement.
             

            Sample Input
            3 5 5 2 4 3 3 3
             

            Sample Output
            1 2 1 3 -1
             

             

            一開始沒想明白怎么做 ,  仔細想了想,   再次 讀題后 發(fā)現(xiàn) , n <= 200000;  也就是說  最多 也就 200000 條廣告 , 你就算每行貼一張 ,

            最多也就貼到 200000 行,  所以  不要被  h <= 10^9  次方嚇到了  ,認為 線段樹開不了那么大的數(shù)組  . 只要開 200000 就可以了 .

             

            其他的 沒什么 好說的 , 知道這個 就直接 暴 吧 ............將近 7000MS .=水過.................   g++提交 還華麗的 送出了 一次 TLE....

            C++  水過了 ............

             

            //    一直沒明白 為什么我的 代碼速度 那么 慢,  查詢后 更新 的時間是 2000MS 左右  , 我的 是 查詢 就更新了,

            竟然要 將近 7000MS ? 非常 郁悶 ,  不信邪的 繼續(xù) 檢查 代碼, 在 瞪了 1哥小時后 , 忽然想到 : 把 cout 改成

            printf 會怎樣?   結(jié)果 :  1640 MS  AC ..............鬼知道他的 數(shù)據(jù)量有多大..... cout 和 printf

            竟然 差了 5000 MS 的時間 ...........無語

            代碼如下 :

             

             /*

            Coded By  : MiYu

            Link      : http://www.cnblogs.com/MiYu  || http://m.shnenglu.com/MiYu

            Author By : MiYu

            Test      : 1

            Program   : 2795

            */

            //#pragma warning( disable:4789 )

            #include <iostream>

            #include <algorithm>

            #include <string>

            #include <set>

            #include <map>

            #include <utility>

            #include <queue>

            #include <stack>

            #include <list>

            #include <vector>

            #include <cstdio>

            #include <cstdlib>

            #include <cstring>

            #include <cmath>

            using namespace std;


            struct ADV {

                   int left, right, val;

                   int mid () { return ( left + right ) >> 1; }     

            }adv[800000];

            int N, W, H, w;

            void creat ( int l, int r, int rt = 1 ){

                 adv[rt].left = l;

                 adv[rt].right = r;

                 adv[rt].val = W;

                 if ( l == r )

                    return ;

                 int mid = adv[rt].mid();

                 creat ( l, mid, rt << 1 );

                 creat ( mid + 1, r, ( rt << 1 ) + 1 );

            }

            void add ( int rt = 1, int wei = w ){

                if ( wei <= adv[rt].val ){

                     if ( adv[rt].left == adv[rt].right ){

                          adv[rt].val -= wei;

                          //cout << adv[rt].left << endl;  //杯具的 地方

            printf ( "%d\n", adv[rt].left ); 

                          return ;     

                     } else if ( adv[rt<<1].val >= wei ) {

                            add ( rt << 1 );

                            adv[rt].val = max ( adv[rt<<1].val, adv[(rt<<1)+1].val );     

                     } else {

                            add ( ( rt << 1 ) + 1 );

                            adv[rt].val = max ( adv[rt<<1].val, adv[(rt<<1)+1].val );        

                     }   

                } else {

                       //cout << -1 << endl;      //杯具的地方

            puts ( "-1" );   

                }   

            }

            inline bool scan_ud(int &num)

            {

                char in;

                in=getchar();

                if(in==EOF) return false;

                while(in<'0'||in>'9') in=getchar();

                num=in-'0';

                while(in=getchar(),in>='0'&&in<='9'){

                    num*=10,num+=in-'0';

                }

                return true;

            }

            int main ()

            {

                while ( scan_ud (H)&&scan_ud (W)&&scan_ud (N) ) {

                       if ( H > 200000 )

                           H = 200010;

                       creat ( 1, H );

                       for ( int i = 1; i <= N; ++ i ) {

                            scan_ud (w);

                            add ( );     

                       }      

                }

                return 0;

            }

             

             

             

             

            另 附上 傻崽  神牛 代碼 :

             

            #include <iostream>

            #include <algorithm>

            #include <string>

            #include <set>

            #include <map>

            #include <utility>

            #include <queue>

            #include <stack>

            #include <list>

            #include <vector>

            #include <cstdio>

            #include <cstdlib>

            #include <cstring>

            #include <cmath>

            #define FF(i,a) for( int i = 0 ; i < a ; i ++ )

            #define FOR(i,a,b) for( int i = a ; i < b ; i ++ )

            #define LL(a) a<<1

            #define RR(a) a<<1|1

            template<class T> inline void checkmin(T &a,T b) {if(a < 0 || a > b)a = b;}

            template<class T> inline void checkmax(T &a,T b) {if(a < b) a = b;}

            using namespace std;

            struct Node {

            int val;

            int idx;

            friend bool operator < (Node a , Node b) {

            if(a.val == b.val) {

            return a.idx > b.idx;

            }

            return a.val < b.val;

            }

            }error;

             

            struct Seg_Tree{

            int left,right;

            Node node;

            int mid() {

            return (left + right)>>1;

            }

            }tt[800000];

             

            int n , h , m;

             

            void build(int l,int r,int idx) {

            tt[idx].left = l;

            tt[idx].right = r;

            tt[idx].node.idx = l;

            tt[idx].node.val = h;

            if(l == r) return ;

            int mid = tt[idx].mid();

            build(l,mid,LL(idx));

            build(mid+1,r,RR(idx));

            }

             

            void update(int l,int r,int val,int idx) {

            if(l <= tt[idx].left && r >= tt[idx].right) {

            tt[idx].node.val += val;

            return ;

            }

            int mid = tt[idx].mid();

            if(l <= mid) update(l,r,val,LL(idx));

            if(mid < r) update(l,r,val,RR(idx));

            tt[idx].node = max(tt[LL(idx)].node,tt[RR(idx)].node);

            }

             

            Node query(int w,int idx) {

            if(tt[idx].node.val < w) {

            return error;

            }

            if(tt[idx].left == tt[idx].right) {

            return tt[idx].node;

            }

            if(tt[LL(idx)].node.val >= w) {

            return query(w,LL(idx));

            } else {

            return query(w,RR(idx));

            }

            }

             

            int main() {

            error.idx = -1;

            while(scanf("%d%d%d",&n,&h,&m) == 3) {

            checkmin(n,m);

            build(1,n,1);

            while(m --) {

            int w;

            scanf("%d",&w);

            Node ret = query(w,1);

            printf("%d\n",ret.idx);

            if(ret.idx != -1) {

            update(ret.idx,ret.idx,-w,1);

            }

            }

            }

            return 0;

             

             

            亚洲精品成人久久久| 国产成人精品久久亚洲高清不卡| 欧美一级久久久久久久大片| 久久久91人妻无码精品蜜桃HD| 久久国产免费直播| 久久精品国产亚洲av麻豆图片| 99久久婷婷国产综合亚洲| 国产呻吟久久久久久久92| 久久综合九色综合欧美就去吻| 亚洲欧美日韩久久精品第一区| 97精品伊人久久久大香线蕉| 久久精品成人欧美大片| 国产精品久久久久久搜索| 久久亚洲欧洲国产综合| 蜜臀av性久久久久蜜臀aⅴ麻豆| 国产成人久久久精品二区三区| 伊人色综合久久天天网| 亚洲天堂久久精品| 久久久无码精品亚洲日韩按摩 | 久久久久亚洲av毛片大| 久久亚洲AV成人出白浆无码国产 | 老司机午夜网站国内精品久久久久久久久| 亚洲午夜久久久| 精品久久久久久久| 亚洲精品国精品久久99热一| 国产精品九九久久免费视频| 久久夜色精品国产噜噜噜亚洲AV| 亚洲国产精品综合久久一线| 91久久精品视频| 99国产欧美精品久久久蜜芽| 精品久久久久久久久免费影院| 精品久久久无码中文字幕| 久久国产免费观看精品| 久久精品国产网红主播| 成人妇女免费播放久久久| 久久精品亚洲精品国产色婷| 久久精品成人欧美大片| 亚洲日韩中文无码久久| 亚洲AV无码一区东京热久久| 一本色道久久99一综合| 乱亲女H秽乱长久久久|