• <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), 轉帖請注明 : 轉載自 ______________白白の屋    

             

            題目地址:

             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 會怎樣?   結果 :  1640 MS  AC ..............鬼知道他的 數(shù)據(jù)量有多大..... cout 和 printf

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

            代碼如下 :

             

             /*

            Coded By  : MiYu

            Link      : http://www.cnblogs.com/MiYu  || http://www.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;

             

             

            综合久久精品色| 日本一区精品久久久久影院| 青青热久久国产久精品| 久久精品国产欧美日韩| 免费精品久久天干天干| 亚洲中文字幕无码久久2020 | 久久久久久久久久久久中文字幕| 久久受www免费人成_看片中文| 久久无码专区国产精品发布| 国产亚洲精品久久久久秋霞| 欧美亚洲色综久久精品国产| 18岁日韩内射颜射午夜久久成人| 久久久久99精品成人片三人毛片 | 国产精品熟女福利久久AV| 亚洲精品综合久久| 国产一级做a爰片久久毛片| 青青久久精品国产免费看| 久久久精品人妻一区二区三区蜜桃 | 91秦先生久久久久久久| 精品国产日韩久久亚洲| 丰满少妇高潮惨叫久久久| 久久综合狠狠综合久久97色| 久久精品亚洲日本波多野结衣| 久久久受www免费人成| 久久99精品久久久久久久久久| 久久www免费人成精品香蕉| 99精品久久精品一区二区| 久久国产香蕉视频| 久久亚洲国产精品一区二区| 亚洲AV无码1区2区久久| 亚洲а∨天堂久久精品| 91精品婷婷国产综合久久| 人妻精品久久无码区| 久久毛片一区二区| 亚洲午夜无码AV毛片久久| 国产成人精品久久亚洲高清不卡| 久久丫精品国产亚洲av| 一本久久a久久精品vr综合| 偷偷做久久久久网站| 亚洲精品乱码久久久久久蜜桃| 国产精品gz久久久|