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

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜


MiYu原創, 轉帖請注明 : 轉載自 ______________白白の屋    

 

題目地址:

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的最左邊的區間,這個和HOTEL是沒有區別,還是用那三個函數找到最左邊的區間并加以更新,cov = 1

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

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

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

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

 

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

  今天一早起來 繼續查錯.......   一直很奇怪 為什么用 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://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: 線段為空   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 沒區別 

                                    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 小杰
第一次來,沙發了~~

# 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>
            亚洲经典在线看| 99在线精品视频在线观看| 欧美日本韩国| 美国成人毛片| 国产色产综合产在线视频| 亚洲乱码视频| 亚洲精品亚洲人成人网| 久久视频国产精品免费视频在线| 亚洲免费在线播放| 欧美色图麻豆| 亚洲精品日本| 91久久国产综合久久蜜月精品 | 欧美精品国产一区| 久久人人爽人人爽| 国产视频久久久久| 亚洲欧美欧美一区二区三区| 亚洲一区制服诱惑| 欧美性色视频在线| 日韩亚洲欧美精品| 一区二区三区免费看| 欧美激情91| 亚洲人成亚洲人成在线观看| 亚洲国产精选| 欧美96在线丨欧| 亚洲国产精品久久人人爱蜜臀| 亚洲激情在线视频| 欧美激情一区三区| 亚洲精品国产品国语在线app| 亚洲精品中文字幕在线| 欧美激情亚洲综合一区| 亚洲欧洲在线一区| 日韩午夜视频在线观看| 欧美日韩久久不卡| 一区二区欧美视频| 欧美一区影院| 黄色亚洲精品| 欧美.日韩.国产.一区.二区| 亚洲国产成人精品视频| 在线视频欧美日韩精品| 欧美系列亚洲系列| 欧美在线亚洲| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲大片在线观看| 99re6热只有精品免费观看| 欧美日韩一区二区三| 亚洲一区二区三区在线视频| 久久精品成人一区二区三区蜜臀 | 麻豆国产精品777777在线| 亚洲第一精品夜夜躁人人躁| 欧美精品系列| 欧美一区二区成人6969| 美腿丝袜亚洲色图| 宅男在线国产精品| 国产日韩欧美视频在线| 麻豆久久婷婷| 亚洲视频一区在线观看| 久久久之久亚州精品露出| 亚洲另类春色国产| 国产精品揄拍500视频| 久久亚洲一区二区三区四区| 亚洲久久一区二区| 久久只有精品| 亚洲一区二区成人在线观看| 一区二区自拍| 国产精品久久久久永久免费观看 | 欧美福利精品| 欧美亚洲免费| 日韩一级片网址| 国产亚洲欧美一区二区| 欧美高清在线| 久久精品视频在线观看| 日韩亚洲一区在线播放| 欧美.日韩.国产.一区.二区| 亚洲一区二区三区中文字幕| 亚洲电影一级黄| 国产欧美日韩高清| 欧美日韩一二三四五区| 免费观看不卡av| 欧美一级视频一区二区| 夜夜嗨av色一区二区不卡| 免费不卡在线观看| 久久国产精品久久久久久| 日韩一级黄色片| 亚洲黄色尤物视频| 国产一区二区三区最好精华液| 欧美三级韩国三级日本三斤| 欧美高潮视频| 裸体丰满少妇做受久久99精品| 午夜欧美精品| 亚洲欧美激情四射在线日 | 在线一区亚洲| 亚洲精品网站在线播放gif| 极品尤物久久久av免费看| 国产欧美va欧美不卡在线| 欧美性开放视频| 欧美日韩一二三区| 欧美日韩国产一区精品一区| 欧美成人午夜影院| 免费观看成人| 欧美国产视频在线| 欧美激情视频在线免费观看 欧美视频免费一| 久久精品国产清自在天天线 | 蜜月aⅴ免费一区二区三区| 久久激情婷婷| 久久免费黄色| 麻豆精品在线观看| 免费欧美日韩| 欧美高清在线视频| 欧美激情小视频| 欧美日韩国产影院| 欧美美女视频| 欧美天堂在线观看| 国产精品久久久久7777婷婷| 国产精品久久久久久久7电影| 欧美视频在线观看一区| 国产精品网站在线观看| 国产欧美一区二区精品婷婷 | 在线一区二区三区四区五区| 亚洲视频国产视频| 亚洲欧美国产日韩天堂区| 欧美在线国产精品| 久久亚洲不卡| 欧美激情一二区| 亚洲精品在线视频| 亚洲一区二区三区免费观看| 亚洲欧美bt| 久久久人成影片一区二区三区| 久久久一二三| 欧美日韩精品是欧美日韩精品| 欧美视频免费在线观看| 国产精品卡一卡二卡三| 激情av一区| 99精品国产在热久久下载| 亚洲在线一区| 久久久精品日韩欧美| 欧美xart系列在线观看| a91a精品视频在线观看| 久久aⅴ国产欧美74aaa| 欧美激情中文字幕乱码免费| 国产精品久久久久久久电影 | 麻豆91精品| 欧美色图一区二区三区| 国产一区二区三区电影在线观看| 91久久久久久久久| 香蕉亚洲视频| 欧美成人小视频| 中文网丁香综合网| 久久女同精品一区二区| 国产精品久久久久久模特| 亚洲第一主播视频| 欧美亚洲综合久久| 亚洲激情网站免费观看| 性欧美办公室18xxxxhd| 欧美另类综合| 在线观看成人av| 亚洲综合999| 亚洲国产成人精品久久久国产成人一区| 亚洲图色在线| 欧美国产精品劲爆| 一色屋精品视频在线观看网站| 亚洲一区二区三区精品在线观看| 免费试看一区| 欧美亚洲视频一区二区| 欧美性猛交视频| 亚洲精品欧美| 欧美成年视频| 欧美在线日韩| 国产精品视频精品| 亚洲视频综合| 亚洲激情六月丁香| 久久综合99re88久久爱| 国产一区二区久久久| 亚洲免费视频一区二区| 亚洲欧洲日韩综合二区| 欧美α欧美αv大片| 黑人巨大精品欧美黑白配亚洲| 亚洲欧美在线免费观看| 亚洲每日在线| 欧美精品手机在线| 99riav1国产精品视频| 欧美成人一区二区三区| 久久婷婷一区| 在线成人av.com| 美国十次成人| 久久婷婷av| 亚洲第一精品夜夜躁人人躁| 美女国产一区| 久久婷婷蜜乳一本欲蜜臀| 在线观看欧美精品| 免费视频一区| 欧美成人免费在线观看| 亚洲人成77777在线观看网| 欧美激情一区二区三区| 美脚丝袜一区二区三区在线观看 | 午夜精品亚洲一区二区三区嫩草| 一区二区三区高清| 国产精品高清在线| 欧美综合国产| 久久久91精品国产一区二区精品| 伊人久久婷婷|