青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(24)

隨筆分類(lèi)(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜


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

 

題目地址:

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

題目描述:

Memory Control

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 703    Accepted Submission(s): 147


Problem Description
Memory units are numbered from 1 up to N.
A sequence of memory units is called a memory block. 
The memory control system we consider now has four kinds of operations:
1.  Reset Reset all memory units free.
2.  New x Allocate a memory block consisted of x continuous free memory units with the least start number
3.  Free x Release the memory block which includes unit x
4.  Get x Return the start number of the xth memory block(Note that we count the memory blocks allocated from left to right)
Where 1<=x<=N.You are request to find out the output for M operations. 
 

Input
Input contains multiple cases.
Each test case starts with two integer N,M(1<=N,M<=50000) ,indicating that there are N units of memory and M operations.
Follow by M lines,each line contains one operation as describe above.
 

Output
For each “Reset” operation, output “Reset Now”.
For each “New” operation, if it’s possible to allocate a memory block,
output “New at A”,where Ais the least start number,otherwise output “Reject New”.
For each “Free” operation, if it’s possible to find a memory block occupy unit x,
output “Free from A to B”,where A and B refer to the start and end number of the memory block,otherwise output “Reject Free”.
For each “Get” operation, if it’s possible to find the xth memory blocks,
output “Get at A”,where A is its start number,otherwise output “Reject Get”.
Output one blank line after each test case.
 

Sample Input
6 10 New 2 New 5 New 2 New 2 Free 3 Get 1 Get 2 Get 3 Free 3 Reset
 

Sample Output
New at 1 Reject New New at 3 New at 5 Free from 3 to 4 Get at 1 Get at 5 Reject Get Reject Free Reset Now
 

題目分析 :

PKU3667 HOTEL的加強(qiáng)版,而且 HOTEL 3個(gè)函數(shù)都沒(méi)有任何變化。

  第一哥指令 New  就是找一段長(zhǎng)為X的最左邊的區(qū)間,這個(gè)和HOTEL是沒(méi)有區(qū)別,還是用那三個(gè)函數(shù)找到最左邊的區(qū)間并加以更新,cov = 1

  第二個(gè)指令是Free  x就是找一個(gè)包含X的區(qū)間,咋一看以為要重寫(xiě)一個(gè)QUERY函數(shù),其實(shí)沒(méi)有必要,使用VECTOR數(shù)組保存下每次占領(lǐng)的區(qū)間,并且由于VECTOR是向量,可以刪除

中間的,并任意在中間加區(qū)間,十分方便。那我們現(xiàn)在向量里找到那個(gè)區(qū)間,接著進(jìn)行更新,cov = 0;

  第三個(gè)指令是Get x就是找到第X個(gè)區(qū)間的范圍,用VECTOR的記錄很快就能找到

  第四個(gè)指令Reset,很方面,更新一下即可

 

注意 二分不要寫(xiě)錯(cuò)了 ,  剛開(kāi)始的 時(shí)候用的 lower_bound  WA 到我想吐.................................    具體看代碼注釋

  今天一早起來(lái) 繼續(xù)查錯(cuò).......   一直很奇怪 為什么用 lower_bound  和 upper_bound 是 WA 的.   可能是早晨頭腦比較清醒, 半個(gè)小時(shí), 終于找到了錯(cuò)誤的原因 !

其實(shí)就是一個(gè)小小的錯(cuò)誤.....  : modify ( it->beg, it->end, 0 );

                                              vec.erase ( it ); 

我寫(xiě)成了 這樣 :    vec.erase ( it ); 

                                     modify ( it->beg, it->end, 0 ); 

竟然把迭代器刪除了再 使用  ....        杯具.........................

代碼如下 :

/*

Mail to   : miyubai@gamil.com

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

Author By : MiYu

Test      : 2

Complier  : g++ mingw32-3.4.2

Program   : HDU_2871

Doc Name  : Memory Control

*/

//#pragma warning( disable:4789 )

#include <iostream>

#include <fstream>

#include <sstream>

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

#include <ctime>

using namespace std;

inline int max ( int a, int b ) {

       return a > b ? a : b;       

}

struct segTree {

       int left, right, lVal, rVal, mVal, cov;// cov -- >  0: 線(xiàn)段為空   1: 線(xiàn)段為滿(mǎn)  -1:2種情況都有 

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

       int dis () { return right - left + 1; }

       void set ( int flag ) { // 0: 線(xiàn)段為空   1: 線(xiàn)段為滿(mǎn) 

            if ( flag ){

                 cov = 1;

                 lVal = rVal = mVal = 0;  

            } else {

                 cov = 0;

                 lVal = rVal = mVal = right - left + 1;     

            }

       }     

}seg[150010];

void creat ( int left, int right, int rt = 1 ) {   // 初始化線(xiàn)段 

     seg[rt].left = left;

     seg[rt].right = right;

     seg[rt].set (0);

     if ( left == right ) return;

     int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();  

     creat ( left, mid, LL );

     creat ( mid + 1, right, RR );  

}

void modify ( int left, int right, int flag, int rt = 1 ) {

     if ( seg[rt].left >= left && seg[rt].right <= right ) {   //如果線(xiàn)段被覆蓋,  直接按flag標(biāo)記處理,返回 

         seg[rt].set ( flag );   return;

     }     

     int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();

     if ( seg[rt].cov != -1 ) {     // 如果線(xiàn)段不是混合情況(即線(xiàn)段是被覆蓋的), 把標(biāo)志下傳 

          seg[LL].cov = seg[RR].cov = seg[rt].cov;

          seg[LL].set ( seg[LL].cov );   

          seg[RR].set ( seg[RR].cov );

     } 

     if ( right <= mid ) modify ( left, right, flag, LL );    //遞歸更新線(xiàn)段 

     else if ( left > mid ) modify ( left, right, flag, RR );

     else {

           modify ( left, mid, flag, LL );

           modify ( mid + 1, right, flag, RR );     

     }

     if ( seg[LL].cov == 0 && seg[RR].cov == 0 ) seg[rt].cov = 0; //線(xiàn)段為空 

     else if ( seg[LL].cov == 1 && seg[RR].cov == 1 ) seg[rt].cov = 1; //線(xiàn)段滿(mǎn) 

     else seg[rt].cov = -1;  // 2種情況都有 

     seg[rt].mVal = max(seg[LL].rVal+seg[RR].lVal,max(seg[LL].mVal, seg[RR].mVal)); // 線(xiàn)段的更新,  經(jīng)典部分

     seg[rt].lVal = seg[LL].lVal + ( seg[LL].cov == 0 ? seg[RR].lVal : 0 );

     seg[rt].rVal = seg[RR].rVal + ( seg[RR].cov == 0 ? seg[LL].rVal : 0 );

}

int query ( int val, int rt = 1 ) {

    int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();

    if ( seg[rt].cov == 0 && seg[rt].mVal >= val ) {   //線(xiàn)段為空,且可用,直接返回線(xiàn)段左端點(diǎn) 

             return seg[rt].left;

    } else if ( seg[rt].cov == -1 ) {   //分三種 情況處理  左   左右    右  處理   

         if ( seg[LL].mVal >= val ) return query ( val, LL );

         else if ( seg[LL].rVal + seg[RR].lVal >= val ) return mid - seg[LL].rVal + 1;

         else if ( seg[RR].mVal >= val )return query ( val, RR );  

    }   

    return 0;

}

struct P {

       int beg, end;

       void set(int &a, int b) { beg = a; end = b; }

       friend bool operator < ( const P& a, const P& b ) {

            return a.beg < b.beg;     

       }       

};

vector <P> vec;

vector <P>::iterator it;

int find ( int &x ) {   // 2分找滿(mǎn)足要求的線(xiàn)段的下一條線(xiàn)段 

   int beg = 0;

   int end = vec.size() - 1;

   while ( beg <= end ) {

         int mid = ( beg + end ) >> 1;

         if ( vec[mid].beg <= x ) {

            beg = mid + 1;

           } else {

                end = mid - 1;

           }

    }

   return beg;

}

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 ()

{

    int N, M, left, right, val, choice;

    char ask[10];

    P temp, tt;

    while ( scan_ud(N)&& scan_ud(M) ) {

           creat ( 1, N );

           vec.clear();

           while ( M -- ) {

                 scanf ( "%s",ask );

                 switch ( ask[0] ) {

                         case 'R' : modify ( 1, N, 0 );  //因?yàn)榫€(xiàn)段已經(jīng)構(gòu)建好了, 更新下就可以了 

                                    vec.clear();     //記得 vec clear() 一下 

                                    puts ( "Reset Now" );

                                    break;

                         case 'N' : scan_ud( val );

                                    left = query ( val );  // 和 PKU3667 沒(méi)區(qū)別 

                                    if ( left == 0 || seg[1].mVal < val ) puts ( "Reject New" );        

                                    else {

                                          modify ( left, left + val - 1 , 1 );

                                          temp.set( left,left+val-1 );

                                          right = find ( left );

                                          vec.insert ( vec.begin() + right, temp );

                                          printf ( "New at %d\n",left );     

                                    }   

                                    break;

                         case 'F' : scan_ud( val );

                                    right = find ( val ) - 1;

                                    if ( right == -1 || vec[right].end < val ) { //沒(méi)找到 

                                     puts("Reject Free");

                                 } else {

                                       printf ( "Free from %d to %d\n", vec[right].beg, vec[right].end );

                                       modify ( vec[right].beg, vec[right].end, 0 );

                                       vec.erase ( vec.begin() + right );

                                 }

                                    break;

                         case 'G' : scan_ud( val );

                                    if ( val > vec.size() )          // 直接輸出就行 

                                         puts ( "Reject Get" ); 

                                    else {

                                          printf ( "Get at %d\n",vec[val-1].beg );     

                                    }   

                 }      

           }  

           putchar ( 10 );    

    }

    return 0;

}

 

 

 付 STL  的 主函數(shù), 其他的 和上面的 都一樣  :

 

代碼
int main ()
{
    
int N, M, left, right, val, choice;
    
char ask[10];
    P temp;
    
while ( scan_ud(N)&& scan_ud(M) ) {
           creat ( 
1, N );
           vec.clear();
           
while ( M -- ) {
                 scanf ( 
"%s",ask );
                 
switch ( ask[0] ) {
                         
case 'R' : modify ( 1, N, 0 );
                                    vec.clear();
                                    puts ( 
"Reset Now" );
                                    
break;
                         
case 'N' : scan_ud( val );
                                    left 
= query ( val );
                                    
if ( left == 0 || seg[1].mVal < val ) puts ( "Reject New" );        
                                    
else {
                                          modify ( left, left 
+ val - 1 , 1 );
                                          temp.set( left,left
+val-1 );
                                          it 
= lower_bound ( vec.begin(),vec.end(),temp );
                                          vec.insert ( it, temp );
                                          printf ( 
"New at %d\n",left );     
                                    }   
                                    
break;
                         
case 'F' : scan_ud( val );
                                    temp.set ( val,val );
                                    it 
= upper_bound ( vec.begin(),vec.end(),temp );
                                    
if ( vec.empty() || it == vec.begin() || (it-1)->end < val || (it-1)->beg > val ) {
                                         puts ( 
"Reject Free" );
                                         
break;
                                    }
                                    it 
--;
                                    printf ( 
"Free from %d to %d\n",it->beg, it->end );
                                    modify ( it
->beg, it->end, 0 );
                                    vec.erase ( it );    
                                    
break;
                         
case 'G' : scan_ud( val );
                                    
if ( val > vec.size() )
                                         puts ( 
"Reject Get" ); 
                                    
else {
                                          printf ( 
"Get at %d\n",vec[val-1].beg );     
                                    }   
                 }      
           }  
           putchar ( 
10 );    
    }
    
return 0;
}

 

 

Feedback

# re: HDU 2871 HDOJ 2871 Memory Control ACM 2871 IN HDU[未登錄](méi)  回復(fù)  更多評(píng)論   

2010-10-13 14:28 by 小杰
第一次來(lái),沙發(fā)了~~

# re: HDU 2871 HDOJ 2871 Memory Control ACM 2871 IN HDU[未登錄](méi)  回復(fù)  更多評(píng)論   

2011-04-01 22:10 by dd
我很喜歡你寫(xiě)的代碼
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜伦理片一区| 一区二区三区日韩在线观看| 亚洲小说欧美另类社区| 久久夜色精品一区| 国产欧美精品| 亚洲视频一区在线| 亚洲成在人线av| 久久国产精品免费一区| 国产精品久久久久久av下载红粉 | 欧美精品一区在线观看| 亚洲第一福利视频| 久久免费高清| 性色av一区二区三区| 欧美亚男人的天堂| 亚洲午夜一区二区| 99视频国产精品免费观看| 免费在线亚洲| 亚洲国产美女精品久久久久∴| 久久精视频免费在线久久完整在线看| 亚洲视频第一页| 欧美日本不卡| 夜夜嗨av一区二区三区中文字幕| 亚洲国产小视频在线观看| 美女网站在线免费欧美精品| 在线精品一区二区| 欧美69wwwcom| 久久视频在线免费观看| 在线观看亚洲精品| 欧美电影打屁股sp| 美女视频一区免费观看| 亚洲韩国日本中文字幕| 欧美成人乱码一区二区三区| 久久久在线视频| 亚洲承认在线| 欧美高清不卡在线| 欧美aa在线视频| 亚洲免费电影在线| 亚洲精品日韩精品| 欧美区在线观看| 亚洲午夜未删减在线观看| 亚洲午夜久久久| 国产日韩精品久久久| 久久久精品性| 久久资源在线| 亚洲理论电影网| 亚洲六月丁香色婷婷综合久久| 欧美色欧美亚洲另类七区| 亚洲免费在线观看视频| 亚洲欧美制服另类日韩| 国产综合精品| 欧美成人中文字幕| 欧美日韩国产天堂| 性色av一区二区三区在线观看 | 亚洲欧洲一区二区三区久久| 亚洲国产精品成人| 欧美日韩理论| 午夜久久久久久| 久久精品道一区二区三区| 亚洲国产岛国毛片在线| 亚洲精品一区二区三区在线观看| 欧美午夜免费| 久久久久久色| 免费日韩av电影| 中文欧美在线视频| 午夜久久一区| 亚洲国产mv| 99精品免费视频| 国产亚洲一区在线| 亚洲福利国产| 国产精品日韩在线| 免费欧美在线视频| 欧美日韩卡一卡二| 久久久久免费| 欧美日韩成人在线观看| 欧美一区二区三区久久精品| 久久久久久噜噜噜久久久精品| 99精品国产一区二区青青牛奶| 亚洲免费婷婷| 亚洲日韩欧美一区二区在线| 一本色道婷婷久久欧美| 国外成人性视频| 亚洲美女在线观看| 国产综合网站| 亚洲日本成人网| 国产一区二区三区精品久久久| 亚洲电影网站| 国产女主播在线一区二区| 欧美激情综合| 国产日本欧美一区二区| 亚洲国产另类精品专区| 国产欧美日韩不卡| 亚洲精品欧美日韩| 国内揄拍国内精品少妇国语| 亚洲精品国精品久久99热| 国产免费成人在线视频| 亚洲激情欧美| 韩国精品久久久999| 99视频在线精品国自产拍免费观看 | 亚洲大胆人体在线| 国产精品视频观看| 亚洲国产一二三| 国产婷婷色一区二区三区四区 | 久久日韩精品| 欧美一区二区黄色| 欧美日韩爆操| 欧美不卡一区| 国产日韩精品入口| 日韩一二三区视频| 亚洲国产日韩美| 欧美在线你懂的| 亚洲综合丁香| 欧美日本在线观看| 欧美成人有码| 国产一区高清视频| 亚洲香蕉网站| 一区二区三区日韩| 免费一级欧美片在线播放| 久久成人免费网| 国产精品va| 亚洲精品韩国| 亚洲黄页视频免费观看| 欧美在线观看视频在线| 午夜精品久久久久久久蜜桃app| 欧美激情亚洲另类| 亚洲高清视频一区| 在线观看国产精品淫| 性欧美xxxx视频在线观看| 亚洲字幕一区二区| 欧美三区在线视频| 亚洲精品在线免费观看视频| 亚洲国产精品久久久久婷婷老年| 欧美一区二区三区精品电影| 午夜久久久久| 国产精品私人影院| 亚洲网站在线播放| 亚洲免费中文字幕| 欧美性猛交视频| 日韩图片一区| 一区二区免费在线观看| 欧美看片网站| 91久久精品日日躁夜夜躁欧美| 亚洲激情一区二区| 另类图片综合电影| 免费不卡在线视频| 伊人精品久久久久7777| 久久精品91| 久久综合九九| 亚洲国产99精品国自产| 老司机亚洲精品| 亚洲电影欧美电影有声小说| 91久久精品国产91久久性色| 久久亚洲视频| 亚洲第一色在线| 99re成人精品视频| 欧美日韩亚洲一区二区三区| 99国产成+人+综合+亚洲欧美| 亚洲午夜伦理| 国产精品日韩欧美| 欧美一级视频一区二区| 久久亚洲二区| 亚洲第一天堂av| 欧美大片一区二区三区| 亚洲剧情一区二区| 亚洲愉拍自拍另类高清精品| 国产精品区一区二区三| 香蕉久久夜色精品国产| 久久久久久穴| 亚洲二区视频| 欧美激情中文字幕在线| 亚洲裸体俱乐部裸体舞表演av| 亚洲校园激情| 国产日韩精品在线播放| 久久国产精品第一页| 欧美成人性生活| 一级成人国产| 国产日本欧美一区二区三区| 久久精品国产久精国产思思| 欧美国产精品久久| 在线性视频日韩欧美| 国产精品入口麻豆原神| 久久国产精品99久久久久久老狼| 欧美电影电视剧在线观看| 一区二区三区四区国产精品| 国产精品视区| 老色鬼精品视频在线观看播放| 亚洲精品乱码久久久久久黑人| 亚洲摸下面视频| 激情另类综合| 欧美日韩精品免费观看| 欧美亚洲日本网站| 欧美国产亚洲精品久久久8v| 一区二区三区四区五区在线| 国产精品永久在线| 久久综合99re88久久爱| 亚洲人成久久| 久久精品理论片| 日韩午夜av| 国产女精品视频网站免费 | 浪潮色综合久久天堂| 一本久道综合久久精品|