hdu 2871 线段树(各种操作)

Allegro23.1新功能之软件自带阻抗计算工具操作指导 Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。 阅读详情

Memory Control

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


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


/*
hdu 2871 线段树(各种操作)

New x:从1开始找到一个长度x空白区间来分配内存
Free x:释放x所在连续区间的内存 并输出左右端点
Get x:获得第x个区间的左端点
reset:释放全部的内存

如果对一个区间分配了内存则置为1,空白处全是0
1.对于New操作需要的便是0的最大连续长度 可通过ls,rs,ms来求,先判断区间是否能放下
能则找出它的左端点即可
2.然后是Free,即1的区间。我们可以用from,to来记录一个区间的左右端点,然后通过
push_down下放到单点.所以只需要找出x点对应的节点编号i即可
3.因为求的是第x个区间,所以开始用num求的时候错了好几次。发现可以把区间左端点
标记为1.但是在实现的时候忘记了判断当前位置是否是要更新区间的左端点,卒!
if(tree[i].l == l)
    tree[i].num = 1;
4.对于reset,把区间全部更新为0即可

求单点所在区间左右端点+最长连续区间的运用+求第k个区间

hhh-2016-04-02 17:48:33
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
using namespace std;
#define lson  (i<<1)
#define rson  ((i<<1)|1)
typedef long long ll;
const int maxn = 50050;

struct node
{
    int l,r;
    int ls,ms,rs;   //记录0的连续区间
    int num,same;
    int from,to;    //记录1的左右端点
    int mid()
    {
        return (l+r)>>1;
    }
    int len()
    {
        return (r-l+1);
    }
} tree[maxn<<2];

void push_up(int i)
{
    tree[i].ls = tree[lson].ls,tree[i].rs= tree[rson].rs;
    if(tree[i].ls == tree[lson].len())
        tree[i].ls += tree[rson].ls;
    if(tree[i].rs == tree[rson].len())
        tree[i].rs += tree[lson].rs;
    tree[i].ms = max(tree[lson].ms,tree[rson].ms);
    tree[i].ms = max(tree[i].ms,tree[lson].rs + tree[rson].ls);

    tree[i].num = tree[lson].num + tree[rson].num;
}

void ini(int i,int val)
{
    tree[i].ls=tree[i].rs=tree[i].ms=val;
}

void build(int i,int l,int r)
{
    tree[i].l = l,tree[i].r = r;
    tree[i].same =tree[i].from = tree[i].to = -1;
    tree[i].num = 0;
    if(l == r)
    {
        ini(i,1);
        return ;
    }
    int mid = (l+r)>>1;
    build(lson,l,mid);
    build(rson,mid+1,r);
    push_up(i);
}

void push_down(int i)
{
    if(tree[i].same != -1)
    {
        tree[lson].same = tree[i].same;
        tree[rson].same = tree[i].same;
        tree[lson].from = tree[rson].from = tree[i].from;
        if(tree[i].num != -1)
        {
            tree[lson].num = tree[i].num;
            tree[rson].num = 0;
        }
        tree[lson].to = tree[rson].to = tree[i].to;
        ini(lson,(!tree[i].same)*tree[lson].len());
        ini(rson,(!tree[i].same)*tree[rson].len());
        tree[i].same = -1;
    }

}

void update(int i,int l,int r,int val)
{
    if(tree[i].l >= l && tree[i].r <= r)
    {
        tree[i].same = val;
        if(val)
        {
            if(tree[i].l == l)
            tree[i].num = 1;
            tree[i].from = l;
            tree[i].to = r;
            ini(i,0);
        }
        else
        {
            if(tree[i].l == l)
            tree[i].num = 0;
            tree[i].from = tree[i].to = -1;
            ini(i,tree[i].len());
        }
        return ;
    }
    push_down(i);
    int mid = tree[i].mid();
    if(l <= mid)
        update(lson,l,r,val);
    if(r > mid)
        update(rson,l,r,val);
    push_up(i);
    return ;
}

int New(int i,int len)
{
    if(tree[i].l == tree[i].r)
    {
        return tree[i].l;
    }
    int mid = tree[i].mid();
    push_down(i);
    if(tree[lson].ms >= len)
        return New(lson,len);
    else if(tree[lson].rs + tree[rson].ls >= len)
        return mid-tree[lson].rs+1;
    else
        return New(rson,len);
}

int Free(int i,int k)
{
    if(tree[i].l == tree[i].r)
        return i;
    push_down(i);
    int mid = tree[i].mid();
    if(k <= mid)
        return Free(lson,k);
    else
        return Free(rson,k);
}

int Get(int i,int k)
{
    if(tree[i].l == tree[i].r)
        return tree[i].l;
    push_down(i);
    if(tree[lson].num >= k)
        return Get(lson,k);
    else
        return Get(rson,k-tree[lson].num);
}

char op[10];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        build(1,1,n);
        int x;
        while(m--)
        {
            scanf("%s",op);
            if(op[0] == 'N')
            {
                scanf("%d",&x);

                if(tree[1].ms >= x)
                {
                    int l = New(1,x);
                    printf("New at %d\n",l);
                    update(1,l,l+x-1,1);
                }
                else
                    printf("Reject New\n");

            }
            else if(op[0] == 'F')
            {
                scanf("%d",&x);
                int t = Free(1,x);
                if(tree[t].from == -1)
                    printf("Reject Free\n");
                else
                {
                    printf("Free from %d to %d\n",tree[t].from,tree[t].to);
                    update(1,tree[t].from,tree[t].to,0);
                }
            }
            else if(op[0] == 'G')
            {
                scanf("%d",&x);
                if(tree[1].num >= x)
                    printf("Get at %d\n",Get(1,x));
                else
                    printf("Reject Get\n");
            }
            else if(op[0] == 'R')
            {
                update(1,1,n,0);
                printf("Reset Now\n");
            }
        }
        printf("\n");
    }
    return 0;
}


AI在保险产品定价优化中的创新应用 在当今保险市场中,准确合理的产品定价是保险公司实现可持续发展的关键因素之一。传统的保险产品定价主要基于经验数据和精算模型,但这种方式往往存在数据处理效率低、对复杂风险因素考虑不足等问题。本文的目的在于深入探讨AI技术如何在保险产品定价中进行创新应用,以提高定价的准确性、效率和灵活性,更好地满足市场需求和客户个性化需求。本文的范围涵盖了AI技术在保险产品定价各个环节的应用,包括风险评估、费率计算、产品设计等方面。同时,还会涉及到相关的核心算法、数学模型以及实际应用案例等内容。 阅读详情

相关推荐

海康威视SADP SDK实战:5分钟搞定局域网设备搜索(附C++代码示例)

本文详细解析了海康威视SADP SDK在局域网设备搜索中的高效应用,通过C++代码示例展示如何快速实现设备发现与信息获取。SADP协议支持全面设备信息采集和实时状态更新,适用于智能安防和物联网管理场景,帮助开发者5分钟内完成设备搜索功能集成。

rum55的博客 871

hdu 2871(区间合并)

题意:有n个未分配的单位内存,编号从1到n,四种操作,Reset表示让所有内存还原为未分配状态并输出Reset now,New a表示从左开始找第一个有连续a个未分配的单位内存拿去分配并输出起始内存编号,Free a表示第a个内存所在的分配出去的内存块还原为未分配状态并输出起始和终止内存编号,Get a表示输出第a个分配出去的内存块的起始内存编号。如果有不合法操作输出Reject + 操作名。 题

俯瞰风景 494

CM-GAI:基于连续介质力学与最优传输的数据生成新范式

在数据驱动的工程与科学研究中,如何利用有限的物理数据实现可靠预测是核心挑战。传统方法如深度神经网络,在数据稀缺时往往泛化能力不足且缺乏物理一致性。为解决此问题,一种融合物理原理与数据驱动的新范式应运而生。其核心思想是将数据分布的变化类比为连续介质在广义力驱动下的力学变形过程,通过最优传输理论为分布变换提供最优路径的度量。这种方法将物理规律(如质量守恒、运动方程)作为硬约束嵌入模型,确保了生成过程的物理可解释性。物理信息神经网络(PINNs)则被用作高效求解器,处理高维特征空间中的复杂控制方程。在工程实践中,

weixin_30607029的博客 607

HDU-2871-Memory Control(线段树修改,合并,查询)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题目大意:n个节点,4种操作:1:将所有节点置为0。2:分配一个连续x大小的空间,起始编号小的优先。3:释放包含编号x的空间。4:返回第x个空间的起始编号 思路:线段树的区间修改,合并。维护节点标记,大小,数量,左连续,右连续,最长连续。 对于操作1,根节点标记为0即可。 操作2:获得第...

永远鲜红の幼月的博客 223

ChatGPT高效制作PPT:从内容生成到设计优化全流程

人工智能技术正在改变传统办公文档的创作方式,其中自然语言处理(NLP)与生成式AI的结合为内容创作带来了革命性突破。以ChatGPT为代表的大语言模型(LLM)能够理解复杂指令并生成结构化内容,其核心原理是通过海量数据训练获得的语义理解和文本生成能力。在办公自动化场景中,这种技术特别适合解决PPT制作中的两大痛点:内容创作耗时和逻辑架构困难。通过精心设计的提示词工程,AI可以快速输出包含核心要点、数据支撑的完整内容框架,甚至直接生成Markdown格式的代码以便快速转换为PPT。对于商业计划、项目汇报等高频

weixin_42613018的博客 490

紫光PG2L100H平台DDR3 IP核调试实战:从AXI接口到状态机设计的避坑指南

本文详细介绍了在紫光PG2L100H FPGA平台上调试DDR3 IP核的实战经验,重点解析了AXI接口的特殊行为和状态机设计的关键技巧。通过具体代码示例和调试方法,帮助开发者规避常见陷阱,实现高性能DDR3控制器设计,达到1.2GB/s的稳定带宽。

weixin_28717969的博客 218

HDU 2871 Memory Control(线段树·区间合并·Vector)

题意  模拟内存申请  有n个内存单元  有以下4种操作   Reset  将n个内存单元全部清空   New x  申请一个长度为x的连续内存块  申请成功就输出左端   Free x  将x所在的内存块空间释放  释放成功输出释放的内存始末位置   Get x  输出第x个内存块的起始位置 Reset 和 New 都是基本的区间合并知识  比较简单  Free和Get需要知道内层块的

Deng's site \# 988

视觉定位避坑指南:基于双mark点的坐标转换常见错误排查

本文详细解析了工业视觉项目中基于双mark点的坐标转换常见错误及排查方法,涵盖旋转矩阵构建、坐标系原点选择、图像预处理优化等关键环节。通过实战案例和代码示例,帮助工程师避免定位偏差,提升系统精度,特别适用于自动化检测和精密制造场景。

7z8x2c4v6b9的博客 167

hdu -2871(Memory Control) (线段树区间和并+vector的应用+二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 思路:很容易想到是线段树。不做具体解释了(只说一下自己做题时,觉着好的地方)。 因为这个题需要记录每个数据块,对数据块进行处理,因为vector的插入和删除较方便,所以用vector数组。 要注意的是:在vector中查找模块时要用二分查找,否则会超时。 利用upper_bound,详见...

weixin_44757834的博客 216

OSMDroid 切换地图不更新的问题

用OSMDroid加载Google地图的时候 需要有按钮切换不同图层的地图,如果发现调用了mMapView.setTileSource(ITileSource aTileSource)方法的时候发现地图View没有更新的话,可能是因为两个实例化TileSource对象其子类BitmapTileSourceBase这个类的aName成员变量值一样导致的地图在setTileSource出现不更新问题,...

godoge的博客 1039

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试

本文介绍了当使用Tessy对软件进行单元测试时如何打桩和指针相关测试的注意事项及操作要点,希望能给正在摸索Tessy的网友一点点启发。

啤酒鸭的物联网开发记录博客 1万+

hdu2871(线段树区间合并+vector+二分)

题目链接:poj2871

no pains,no gains 886

26.Labview波形图、XY图、强度图使用精讲

1. 波形图基础概念,如何使用,1.1 波形图与波形图表1.2 XY图如何设计、如何使用?1.3 强度图原理、如何使用、使用案例;2. 图形的参数设置2.1 波形图及波形图表的外观设计2.2 XY图的前面板设计2.3 强度图属性设置。

关注我,更多技术问题欢迎私聊~ 7497

【HDU 2871 Memory Control】线段树之区间操作

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题目大意: 四个操作: 1、New x 找一段长为x的空区间段填满。 下面用0表示空单元,1表示非空单元。 2、Free x 释放包含x的区间段 3、 Get x 找到第x个区间段 4、将整个区间都置为空。 解题思路: 可以说这题应该算是线段树之...

baidui8622的博客 126

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为产品安全基线落地指南:从网络设备到云上业务全覆盖

安全基线是企业网络安全建设的基石,它并非简单套用官方安全配置文档,而是需要在“合规要求”与“业务可用性”之间找到平衡。其原理是通过最小化攻击面、全链路可审计、变更可回退三大原则,将设备从“能用”提升到“抗得住常规攻击、查得到问题、过得了审计”。在实际落地中,无论是交换机、服务器、终端还是云上微服务,都需要建立可执行、可核查的基线标准。例如,借助eNSP模拟器验证配置逻辑,再批量下发到真机;结合等保测评的要求,定期核查账号口令、日志审计、带外管理等关键项。本文从网络设备的安全加固出发,延伸到终端准入与云上应用

weixin_33796177的博客 151

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HDU 2871 Memory Control 线段树 区间合并 单点更新 容器的使用

//HDU 2871 Memory Control 线段树 : 区间合并 单点更新 容器的使用 /* 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题目大意:现在有1到N(N &lt;= 50000)个连续内存块,然后给出四种操作: 1. Reset 释放所有内存块,并且输出“Reset Now”。 2. New x 找到一块有连...

爱.NET 128

hdu 2871 Memory Control(线段树的各种操作&Splay解法)

Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2043    Accepted Submission(s): 480 Problem Description Memory units

志当存高远 987

线段树区间维护(各种操作)hdu2871

Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4355    Accepted Submission(s): 1040 Problem Description Memory unit

龙崎的专栏 583

hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset 清空所有内存2.New x 分配一个大小为x的内存块返回,返回能分配的最小的起始点 3.Free x 释放当前点所在的内存块,并输出左右端点 4.Get x 返回第x个内存块的起始点 讨论每个操作的写法: 第一个操作,把线段树初始化就好...

weixin_30456039的博客 106

HDU 2871 HDOJ 2871 Memory Control ACM 2871 IN HDU

MiYu原创, 转帖请注明 : 转载自______________白白の屋题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2871题目描述:Memory ControlTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Tot...

weixin_30708329的博客 105

HDU 2871 Memory Control(线段树)

HDU 2871 Memory Control 题目链接 题意:内存操作,和hotel那题差不多,多一个get操作 思路:线段树区间合并,其他都差不多,多一个get操作,这个用set去乱搞就过了- -,估计数据鶸吧,多这个操作感觉要用splay去搞了 代码: #include #include #include #include using namespace

Remilia's 965

POJ 3667 Hotel & HDU 2871 Memory Control 线段树区间合并

POJ 3667参考poj 3667 Hotel ——Titanium题意一条线段长度为 nn,初始未被覆盖。进行 两种操作 mm 次: 1. 询问 最左边的 未被覆盖的 长度 ≥D\ge D 的 区域的左端点,并覆盖这段区域; 2. 清除 [x,x+d−1][x,x+d-1] 区域的覆盖。思路线段树上记录的信息还是老套路,左边连续的最大值,右边连续的最大值,一整段中的最大值;清除操作也

kkkkahlua的博客 350

区间合并 内纯释放问题 hdu2871 Memory control

题目链接  hdu2871 Memory control 题目大意: 给n个单元内存,有 四个操作:       1、New x     找一段长为x的空区间段填满。  (下面用0表示空单元,1表示非空单元。)       2、Free x  释放包含x的区间段       3、 Get x 找到第x个区间段       4、将整个区间都置为空。 解题思路:可以

ACM_10000h的专栏 626

HDU 2871 Memory Control

HDU_2871 胡浩的博客上说这个可以做splay的热身题,结果写出来洋洋洒洒270行代码却落得TLE收场,不得不改成线段树去写了。 reset操作是最简单的,直接将根初始化并加个延迟标记即可。 我们可以用lc[](left contiguous)表示一个区间从左边开始连续有多少个空位,rc[](right contiguous)表示一个区间从右边开始连续有多少个空...

weixin_30640769的博客 84

HDU 2871 Memory Control (线段树)

HDU 2871Memory Control 分析: 本题纠结了好多天,又用一下午时间找bug,换思路,终于终于做出来了。极为有毒的一题,相当于把三种线段树类型的题出成了一道,四种操作: ①找出最小的x长度区间并覆盖; ②删除某点x所处的区间; ③找出第x个区间的开始位置; ④清除所有区间; 分析发现: 对于④就是操作多次② 对于②:需要把①的每个区间记录下来,反向操作① 对...

圣诞老头的博客 288

线段树 区间合并

poj3667 Hotel 区间合并入门题,照着代码打的, 题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 2 a b:将[a,a+b-1]的房间清空思路:记录区间中最长的空房间,开三个数组,msum[rt]表示节点rt内连续的1的个数的最大值,lsum[rt]表示从节点rt左端点开始连续1的个数,rsum[rt]表示从节点rt右端点开始连续1的个数。。线段树操作...

weixin_30888027的博客 66

线段树 hdu2871 Memory Control

传送门:点击打开链接 题意:区间内4种操作,1种分配连续长度的区间,2获取某个位置是被谁覆盖的,3获取第几个被覆盖的区间的左端点和右端点,4清空全部。 思路:几乎涵盖了线段树的所有操作,有种恶心的感觉,, 要维护的东西 1.sum,lsum,rsum最大连续个数 2.cnt个数,放在左端点 3.col懒惰标记,默认-1,为0表示要清空,为其他数字表示这一段被占领 #include #

qwb的博客 835
上一篇: hdu 3433 A Task Process 二分+dp
下一篇: hdu 4533 线段树(问题转化+)
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值