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

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(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://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 沒區別 

                                    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>
            一区二区三区高清视频在线观看| 在线免费观看日本欧美| 亚洲欧洲精品天堂一级| 久久国产日本精品| 中文在线资源观看视频网站免费不卡| 欧美激情1区2区| 91久久精品一区二区三区| 中文高清一区| 亚洲另类一区二区| 一区二区三区日韩欧美精品| 国产精品久久久久久影视 | 欧美日韩另类丝袜其他| 亚洲免费观看高清完整版在线观看| 亚洲综合色激情五月| 国产一区二区三区四区在线观看 | 国产婷婷一区二区| 欧美成人免费网站| 欧美激情自拍| 亚洲欧美日韩国产综合在线| 亚洲一二三四久久| 在线观看精品| 亚洲毛片视频| 国产亚洲精品美女| 香蕉久久国产| 日韩亚洲精品在线| 亚洲欧美日韩国产一区二区三区| 亚洲国产你懂的| 亚洲国产日韩欧美综合久久 | 午夜精品久久久久久久久久久久久| 亚洲一区区二区| 好看的日韩av电影| 亚洲日韩中文字幕在线播放| 国产精品欧美久久| 久久久久久久久蜜桃| 欧美激情中文不卡| 日韩午夜在线播放| 国模私拍视频一区| 99人久久精品视频最新地址| 国产亚洲欧美一区在线观看| 午夜精品视频一区| 久久精品国产99| 精品动漫一区| 亚洲免费在线观看视频| 欧美一区深夜视频| 欧美日韩一二三四五区| 亚洲视频自拍偷拍| 久久精品中文字幕免费mv| 狠狠色狠狠色综合人人| 麻豆成人精品| 欧美一级视频一区二区| 欧美精品一区在线| 欧美不卡一区| 国产综合婷婷| 欧美电影在线| 欧美国产日韩a欧美在线观看| 国产精品自在线| 宅男噜噜噜66一区二区| 久久精品30| 亚洲国产乱码最新视频| 欧美日韩国产成人在线| 亚洲国产婷婷| 亚洲欧美精品一区| 在线观看国产精品网站| 欧美日韩精品伦理作品在线免费观看| 亚洲午夜精品网| 欧美福利专区| 久久av一区二区| 国产精品一级二级三级| 久久在线视频在线| 麻豆成人91精品二区三区| 国产日韩欧美精品| 欧美精品高清视频| 欧美在线黄色| 久久乐国产精品| 国产在线视频欧美| 欧美日韩一区二区视频在线观看| 欧美一级片在线播放| 久久电影一区| 日韩亚洲在线观看| 国产综合色一区二区三区| 欧美三级视频在线| 在线视频你懂得一区二区三区| 久久综合图片| 亚洲欧美日韩一区二区三区在线观看 | 亚洲视频香蕉人妖| 欧美激情一区二区三区高清视频| 欧美亚洲一区三区| 一区二区三区免费在线观看| 亚洲电影下载| 好吊色欧美一区二区三区视频| 欧美无砖砖区免费| 亚洲一区二区伦理| 亚洲欧洲日产国产综合网| 亚洲小视频在线观看| 国产精品成人午夜| 性欧美8khd高清极品| 99re视频这里只有精品| 亚洲黄网站在线观看| 欧美mv日韩mv国产网站app| 欧美专区中文字幕| 欧美亚洲尤物久久| 亚洲综合大片69999| 国产专区综合网| 国产欧美日韩亚洲一区二区三区 | 麻豆国产精品一区二区三区| 欧美一级淫片播放口| 亚洲欧美电影院| 亚洲一区美女视频在线观看免费| 99国产麻豆精品| 日韩午夜av在线| 日韩午夜三级在线| 一区二区三区欧美在线| 中日韩男男gay无套| 在线视频精品一| 亚洲一区二区三区精品在线| 亚洲天堂成人在线观看| 亚洲一区二区三区777| 午夜精品久久久久| 欧美中文在线免费| 久久香蕉国产线看观看av| 99av国产精品欲麻豆| 一区二区91| 亚洲免费在线视频一区 二区| 午夜精品一区二区三区在线播放| 亚洲欧美自拍偷拍| 欧美一区二区性| 猛男gaygay欧美视频| 欧美紧缚bdsm在线视频| 国产精品v欧美精品∨日韩| 国产精品综合久久久| 国产一区香蕉久久| 亚洲啪啪91| 亚洲一区二区三区免费观看| 欧美综合77777色婷婷| 免费亚洲视频| 久久久噜噜噜久久狠狠50岁| 你懂的国产精品永久在线| 亚洲激情女人| 亚洲欧美韩国| 每日更新成人在线视频| 欧美日韩亚洲视频| 国产精品五区| 亚洲激情一区二区三区| 亚洲一区二区在线观看视频| 久久激情五月丁香伊人| 欧美激情91| 欧美一激情一区二区三区| 欧美99在线视频观看| 老妇喷水一区二区三区| 欧美日韩国产一区二区| 国产无遮挡一区二区三区毛片日本| 亚洲国产精品www| 亚洲国产日韩美| 亚洲免费在线精品一区| 美女主播精品视频一二三四| 一本大道久久a久久精品综合| 久久精品91久久久久久再现| 欧美一区二区三区四区在线| 欧美黄色精品| 国产一区二区主播在线| 夜夜嗨av一区二区三区四区| 亚洲视频在线看| 亚洲一级在线观看| 美女黄毛**国产精品啪啪| 中国女人久久久| 欧美韩日一区二区| 好吊妞**欧美| 欧美亚洲一级| 妖精视频成人观看www| 免播放器亚洲一区| 国产主播一区二区| 午夜精品美女自拍福到在线| 亚洲国产另类久久久精品极度| 欧美在线观看视频| 国产精品久久中文| 一区二区三区产品免费精品久久75 | 99伊人成综合| 欧美大片在线看免费观看| 国内欧美视频一区二区| 午夜老司机精品| avtt综合网| 欧美日韩国产bt| 99精品欧美一区二区三区| 欧美成人免费在线| 久久精品国产v日韩v亚洲| 国产精品自拍一区| 亚洲欧美日韩一区二区在线| 亚洲伦理在线观看| 欧美日韩一区二区免费视频| 亚洲区一区二| 亚洲国产女人aaa毛片在线| 久久综合狠狠综合久久综合88| 国产一区日韩欧美| 久久精品国产91精品亚洲| 午夜一区在线| 国产一区二区三区在线免费观看 | 久久婷婷麻豆| 亚洲美洲欧洲综合国产一区| 欧美激情第二页| 日韩一级网站|