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

ACM___________________________

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

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜


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

 

題目地址:

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的加強版,而且 HOTEL 3個函數都沒有任何變化。

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

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

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

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

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

 

注意 二分不要寫錯了 ,  剛開始的 時候用的 lower_bound  WA 到我想吐.................................    具體看代碼注釋

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

其實就是一個小小的錯誤.....  : modify ( it->beg, it->end, 0 );

                                              vec.erase ( it ); 

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

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

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

代碼如下 :

/*

Mail to   : miyubai@gamil.com

Link      : http://www.cnblogs.com/MiYu  || http://m.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: 線段為空   1: 線段為滿  -1:2種情況都有 

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

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

       void set ( int flag ) { // 0: 線段為空   1: 線段為滿 

            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 ) {   // 初始化線段 

     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 ) {   //如果線段被覆蓋,  直接按flag標記處理,返回 

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

     }     

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

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

          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 );    //遞歸更新線段 

     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; //線段為空 

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

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

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

     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 ) {   //線段為空,且可用,直接返回線段左端點 

             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分找滿足要求的線段的下一條線段 

   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 );  //因為線段已經構建好了, 更新下就可以了 

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

                                    puts ( "Reset Now" );

                                    break;

                         case 'N' : scan_ud( val );

                                    left = query ( val );  // 和 PKU3667 沒區(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 ) { //沒找到 

                                     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  的 主函數, 其他的 和上面的 都一樣  :

 

代碼
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[未登錄]  回復  更多評論   

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

# re: HDU 2871 HDOJ 2871 Memory Control ACM 2871 IN HDU[未登錄]  回復  更多評論   

2011-04-01 22:10 by dd
我很喜歡你寫的代碼
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲免费大片| 亚洲乱码国产乱码精品精天堂| 亚洲视频高清| 好男人免费精品视频| 亚洲欧洲日本mm| 午夜精品美女久久久久av福利| 亚洲国产一区二区在线| 亚洲一区二区三区精品在线观看| 日韩午夜精品| 美女国内精品自产拍在线播放| 亚洲综合精品四区| 猛干欧美女孩| 99国产精品自拍| 亚洲精品网站在线播放gif| 久久精品国产精品亚洲精品| 午夜国产精品视频免费体验区| 免费日韩av| 六月婷婷一区| 国产日韩久久| 亚洲自拍16p| 亚洲欧美激情一区| 欧美日韩在线精品| 美国十次了思思久久精品导航| 国产日韩三区| 欧美成人嫩草网站| 欧美成人午夜激情视频| 怡红院精品视频| 久久久久久久91| 久久精品国产亚洲a| 国产精品视频成人| 午夜精品久久久久久久蜜桃app| 欧美伊人久久大香线蕉综合69| 欧美视频在线播放| av成人免费观看| 美女脱光内衣内裤视频久久影院| 亚洲一区二区在线看| 1769国内精品视频在线播放| 久久人91精品久久久久久不卡| 老鸭窝91久久精品色噜噜导演| 亚洲视频在线视频| 欧美日韩一区高清| 久久综合免费视频影院| 亚洲国产老妈| 一区二区三区国产精品| 欧美午夜女人视频在线| 亚洲特级毛片| 麻豆精品精华液| 欧美在线啊v一区| 亚洲一区日韩| 99在线视频精品| 国产精品久久毛片a| 亚洲欧美视频一区| 一卡二卡3卡四卡高清精品视频| 欧美一区中文字幕| 亚洲视频日本| 99香蕉国产精品偷在线观看| 亚洲激情六月丁香| 在线不卡中文字幕播放| 狠狠色狠狠色综合日日五| 国产精品爽爽爽| 国产精品久久久久久久电影| 久久成人人人人精品欧| 亚洲综合日韩| 亚洲在线免费视频| 亚洲视频在线视频| 亚洲视频在线播放| 亚洲五月婷婷| 亚洲一区二区精品视频| 亚洲视频在线一区| 亚洲免费婷婷| 午夜视频久久久| 欧美+亚洲+精品+三区| 亚洲午夜一二三区视频| 国外成人在线| 狠狠狠色丁香婷婷综合激情| 国内外成人免费激情在线视频网站| 欧美激情偷拍| 亚洲欧美日韩国产一区二区三区| 亚洲一本视频| 欧美一区1区三区3区公司| 最新成人av网站| 亚洲免费大片| 欧美韩日高清| 久久精品国产久精国产爱| 久久成人人人人精品欧| 一区二区电影免费观看| 亚洲一区精品视频| 欧美在线观看视频一区二区三区| 久久精品国产成人| 欧美.www| av成人福利| 欧美一区三区三区高中清蜜桃 | 99天天综合性| 亚洲一区二三| 久久久久久亚洲精品中文字幕| 一区二区三区国产盗摄| 亚洲欧美色婷婷| 久久久久网址| 亚洲日本免费| 亚洲承认在线| 久久久99久久精品女同性| 亚洲小说欧美另类社区| 欧美在线不卡| 亚洲福利电影| 欧美成在线视频| 亚洲精品综合在线| 亚洲精品日韩欧美| 亚洲欧美日韩另类| 免费成人你懂的| 欧美性开放视频| 在线欧美电影| 午夜日韩福利| 亚洲高清不卡在线| 亚洲男同1069视频| 女女同性精品视频| 国产精品亚洲综合久久| 亚洲电影网站| 欧美亚洲一区二区在线| 欧美在线观看视频在线| 欧美国产日韩精品| 午夜精品一区二区三区在线播放| 久久综合久久综合九色| 国产精品久久久久久久久久久久| 激情综合久久| 最新热久久免费视频| 亚洲第一天堂无码专区| 先锋影音国产精品| 亚洲激情另类| 久久久久久九九九九| 国产精自产拍久久久久久| 国产精品一区二区你懂的| 亚洲品质自拍| 久久综合久久综合久久综合| 欧美电影免费| 久久精品91| 国产欧美短视频| 精品999在线播放| 欧美一区二区三区日韩视频| 日韩午夜免费| 欧美a级在线| 在线欧美小视频| 久久久亚洲高清| 午夜精品久久久| 国产精品久久久久久久一区探花| 99pao成人国产永久免费视频| 久久综合五月| 久久精品导航| 国产综合亚洲精品一区二| 欧美影院视频| 亚洲专区国产精品| 国产精品日韩二区| 亚洲自拍啪啪| 国产精品99久久久久久久女警| 欧美精品在线观看91| 国产精品久久久免费| 亚洲一区二区久久| 一区二区三区国产| 欧美日韩免费观看一区| 艳妇臀荡乳欲伦亚洲一区| 亚洲激情综合| 欧美精品三级| 亚洲图片你懂的| 一区二区三区视频免费在线观看| 欧美日韩国产综合网 | 亚洲欧美中日韩| 国产亚洲精品自拍| 日韩视频专区| 亚洲精品国产欧美| 欧美日韩美女在线观看| 亚洲淫性视频| 亚洲欧美视频一区二区三区| 国产日韩视频一区二区三区| 久久精品一区| 久久综合一区| 日韩午夜电影av| 在线亚洲成人| 国产一区二区三区在线观看精品 | 国产精品理论片| 久久大香伊蕉在人线观看热2| 性欧美xxxx大乳国产app| 一区二区在线观看av| 亚洲电影天堂av| 欧美手机在线视频| 久久国产精品第一页| 久久免费少妇高潮久久精品99| 91久久久在线| 这里只有精品丝袜| 国内精品伊人久久久久av影院| 欧美激情第二页| 欧美日韩中文在线| 久久精品中文字幕免费mv| 另类成人小视频在线| 亚洲一区二区三区精品在线| 午夜在线播放视频欧美| 在线精品国产成人综合| 99国产精品| 国产综合欧美| 亚洲日本电影| 国一区二区在线观看| 亚洲精品视频啊美女在线直播|