• <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://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;

             

             

            久久综合视频网站| 久久久久久人妻无码| 99久久精品国产高清一区二区| 天天综合久久一二三区| 国产精品成人久久久久久久| 91精品国产高清91久久久久久| 久久精品青青草原伊人| 波多野结衣久久一区二区| 欧美久久一区二区三区| 要久久爱在线免费观看| 久久综合成人网| 久久精品国产亚洲AV影院| 伊人久久综合成人网| 久久久久久亚洲AV无码专区| 久久精品无码午夜福利理论片| 久久久久99精品成人片试看| 久久丫精品国产亚洲av不卡| 久久亚洲中文字幕精品有坂深雪| 国产婷婷成人久久Av免费高清| 精品久久一区二区三区| 国产精品亚洲综合专区片高清久久久 | 99精品国产99久久久久久97| 亚洲午夜久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久久久久久人妻无码中文字幕爆| 久久精品国产亚洲AV无码麻豆| 久久久91精品国产一区二区三区| 久久精品无码av| 色诱久久久久综合网ywww| 免费国产99久久久香蕉| 亚洲国产小视频精品久久久三级| 午夜精品久久久久久久久| 国产99久久久国产精品~~牛| 久久精品日日躁夜夜躁欧美| 99久久精品影院老鸭窝| 色综合久久久久综合99| avtt天堂网久久精品| 久久精品视频一| 精品无码久久久久久久久久| 奇米综合四色77777久久| 久久久WWW成人|