poj 3667 Hotel

本文介绍了一种使用线段树数据结构解决特定序列操作问题的方法。具体来说,包括了如何通过线段树来高效地处理序列的查询和修改操作,特别是针对空序列进行的操作。文中提供了一个具体的实现示例,详细展示了线段树节点的定义、覆盖操作和查找操作。

http://poj.org/problem?id=3667

题目大意:给定长度n的空序列和m个操作。操作分两种:

1 x:询问长度为x的最左端的空子序列,输出子序列左端点。

2 x l:清空从x开始长度为l的序列(不一定l长度里面都是非空的)。

 

比较基础的线段树实现的段修改。线段树上每个单元记录当前段中最长的空段max,左端开始最长的空段lmax,右端开始最长的空段rmax。

 

AC CODE

program pku_3667;
var max,lmax,rmax:array[1..200000] of longint;
    p:array[1..200000] of boolean;
    i,n,m,x,s,t,l,command:longint;
//============================================================================
procedure cover(be,en,now:longint);
var mid:longint;
begin
  if (s<=be) and (t>=en) then
  begin
    max[now]:=(en-be+1)*x;
    lmax[now]:=max[now];
    rmax[now]:=max[now];
    p[now]:=true; exit;
  end; mid:=(be+en) shr 1;
  if p[now] then
  begin
    max[now shl 1]:=max[now] div (en-be+1)*(mid-be+1);
    lmax[now shl 1]:=max[now shl 1]; rmax[now shl 1]:=max[now shl 1];
    max[now shl 1+1]:=max[now] div (en-be+1)*(en-mid);
    lmax[now shl 1+1]:=max[now shl 1+1]; rmax[now shl 1+1]:=max[now shl 1+1];
    p[now shl 1]:=true; p[now shl 1+1]:=true; p[now]:=false;
  end;
  if s<=mid then cover(be,mid,now shl 1);
  if t>mid then cover(mid+1,en,now shl 1+1);
  if max[now shl 1]>max[now shl 1+1] then
    max[now]:=max[now shl 1] else max[now]:=max[now shl 1+1];
  if rmax[now shl 1]+lmax[now shl 1+1]>max[now] then
    max[now]:=rmax[now shl 1]+lmax[now shl 1+1];
  if lmax[now shl 1]=mid-be+1 then    //不仅要更行max还有lmax,rmax。
    lmax[now]:=lmax[now shl 1]+lmax[now shl 1+1] else lmax[now]:=lmax[now shl 1];
  if rmax[now shl 1+1]=en-mid then
    rmax[now]:=rmax[now shl 1]+rmax[now shl 1+1] else rmax[now]:=rmax[now shl 1+1];
end;
//============================================================================
function find(be,en,now:longint):longint;
var mid:longint;
begin
  if en-be+1=x then exit(be);
  mid:=(be+en) shr 1;
  if p[now] then    //在询问的时候也要推标号,及时更新。
  begin
    max[now shl 1]:=max[now] div (en-be+1)*(mid-be+1);
    lmax[now shl 1]:=max[now shl 1]; rmax[now shl 1]:=max[now shl 1];
    max[now shl 1+1]:=max[now] div (en-be+1)*(en-mid);
    lmax[now shl 1+1]:=max[now shl 1+1]; rmax[now shl 1+1]:=max[now shl 1+1];
    p[now shl 1]:=true; p[now shl 1+1]:=true; p[now]:=false;
  end;
  if max[now shl 1]>=x then find:=find(be,mid,now shl 1) else
  if rmax[now shl 1]+lmax[now shl 1+1]>=x then find:=mid-rmax[now shl 1]+1 else
  find:=find(mid+1,en,now shl 1+1);
end;
//============================================================================
begin
  readln(n,m);
  max[1]:=n; p[1]:=true;
  lmax[1]:=n; rmax[1]:=n;
  for i:=1 to m do
  begin
    read(command);
    if command=1 then
    begin
      readln(x);
      if max[1]>=x then
      begin
        s:=find(1,n,1); t:=s+x-1; x:=0;
        cover(1,n,1); writeln(s);
      end else writeln('0')
    end else
    begin
      readln(s,l); t:=s+l-1; x:=1;
      cover(1,n,1);
    end;
  end;
end.

 

内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需求侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值