博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2871 Memory Control
阅读量:6670 次
发布时间:2019-06-25

本文共 4491 字,大约阅读时间需要 14 分钟。

题意:

给你一段内存单元,你可以对它进行一下操作:

开辟一个内存块,如果开辟成功返回该内存块最左边的值;

删除包含X的内存段元,如果成功输出该内存块的左右值;

找到第X快内存块,如果成功输出该内存块的最左边的值;

清除内存;

这个题的思想与是一样的;这题还要做一个处理的是建立一个链表把之前的内存块首尾点给存储起来,这样就容易对它进行操作;

其余的地方与Hotel一样,这里就不累叙了;

View Code
#include
#include
#include
#include
using namespace std; class Node {
public: int l,r,l_value,r_value; int cover,max; }; class List {
public: int start,end; }; vector
list; Node tree[250000]; int Max( int a, int b ) {
return a > b ? a:b; } void Maketree( int l , int r, int cnt ) {
tree[cnt].l = l; tree[cnt].r = r; tree[cnt].l_value = tree[cnt].r_value = tree[cnt].max = r - l +1; tree[cnt].cover = 0; if( l==r ) {
return ; } int mid = ( l + r )>>1; Maketree( l , mid, cnt*2 ); Maketree( mid + 1 , r ,cnt*2+1 ); } void fun( int cnt ) {
if( tree[cnt].cover == 0 ) tree[cnt].l_value = tree[cnt].r_value = tree[cnt].max = tree[cnt].r - tree[cnt].l +1; else tree[cnt].l_value = tree[cnt].r_value = tree[cnt].max = 0; } void Update( int l , int r , int cnt ,int num ) {
if( l > tree[cnt].r || tree[cnt].l > r) return ; if( tree[cnt].l >= l &&tree[cnt].r <= r ) {
tree[cnt].cover = num; fun( cnt ); return ; } if( tree[cnt].cover != -1 ) {
tree[cnt*2].cover = tree[cnt*2+1].cover =tree[cnt].cover; fun( cnt*2 ); fun( cnt*2+1 ); tree[cnt].cover = -1; } Update( l , r, cnt*2 , num ); Update( l ,r ,cnt*2+1 , num ); if( tree[cnt*2].cover==tree[cnt*2+1].cover ) tree[cnt].cover = tree[cnt*2].cover; else tree[cnt].cover = -1; tree[cnt].l_value = tree[cnt*2].l_value + ( tree[cnt*2].cover==0?tree[cnt*2+1].l_value:0 ); tree[cnt].r_value = tree[cnt*2+1].r_value + ( tree[cnt*2+1].cover == 0? tree[cnt*2].r_value:0 ); tree[cnt].max = Max( Max( tree[cnt*2].max , tree[cnt*2+1].max ), tree[cnt*2].r_value + tree[cnt*2+1].l_value ); } int Query( int num, int cnt ) {
if( tree[cnt].l_value >= num &&tree[cnt].cover ==0 ) {
Update( tree[cnt].l, tree[cnt].l+num -1 , 1, 1 );// printf( "asfasfa" ); return tree[cnt].l; } if( tree[cnt].cover == 1) return 0; if( tree[cnt].max>=num && tree[cnt].cover == -1 ) {
if( tree[cnt*2].max >= num ) {
return Query( num , cnt*2 ); } else if( tree[cnt*2].r_value + tree[cnt*2+1].l_value >= num ) {
int t = tree[cnt*2].r - tree[cnt*2].r_value; Update( t +1, t + num , 1 , 1 ); return t+1 ; } else return Query( num , cnt*2+1 ); } return 0; } int find( int n ) {
int begin = 0 ; int end = list.size()-1; while( begin <= end ) {
int mid = ( begin + end )>>1; if( list[mid].start > n ) end = mid -1; else begin = mid + 1; } return begin; } int main( ) {
int n , m , num,left ,right; char str[10]; while( scanf( "%d%d",&n,&m )==2 ) {
Maketree( 1 , n , 1 ); list.clear(); while( m-- ) {
scanf( "%s" ,str ); if( str[0]=='R' ) {
printf( "Reset Now\n" ); Update(1 , n , 1,0 ); list.clear(); } else {
scanf( "%d",&num ); switch( str[0] ) {
case 'N': left = Query( num ,1 ); if( left ==0 ) printf( "Reject New\n" ); else { right = find( left ); List t; t.start = left ; t.end = left + num -1; list.insert( list.begin() + right , t ); printf( "New at %d\n",left ); } break; case 'F': right = find( num ) -1; if( right ==-1||list[right].end < num ) printf( "Reject Free\n" ); else {
printf( "Free from %d to %d\n",list[right].start , list[right].end ); Update( list[right].start, list[right].end ,1, 0); list.erase( list.begin() + right ); } break; case 'G': if( num > list.size() ) printf( "Reject Get\n" ); else printf( "Get at %d\n",list[num-1].start ); break; } } } } return 0; }

 

转载于:https://www.cnblogs.com/bo-tao/archive/2012/03/06/2381689.html

你可能感兴趣的文章
UI--普通控件总结1--控件使用
查看>>
【外文翻译】使用Timer类去调度任务 ——java
查看>>
关于CountDownLatch控制线程的执行顺序
查看>>
plsql 乱码 注册表 修改文件
查看>>
Docker集群管理(三)—— docker swarm mode基础教程
查看>>
1.urlencoder和urldecoder的使用
查看>>
web移动端布局方式整理
查看>>
蛤玮学计网 -- 简单的判断ip
查看>>
如何解决div里面img图片下方有空白的问题?
查看>>
P3626 [APIO2009]会议中心
查看>>
防火墙
查看>>
Ubuntu下VIM使用指南
查看>>
QTREE5 - Query on a tree V——LCT
查看>>
spring mvc-使用Servlet原生API作为参数
查看>>
第13章 MySQL数据库与JDBC编程
查看>>
百度地图API使用记录
查看>>
linux docker
查看>>
增量式 爬虫
查看>>
第九周作业
查看>>
CefSharp的一些初始化操作
查看>>