hdu 2871 -Memory Control--线段树

本文探讨了一位开发者在解决内存控制问题时遇到的挑战,并通过使用线段树来优化代码效率的过程。重点阐述了如何识别并修复错误逻辑,以及线段树在复杂操作中的应用。

我去此题我简直不想喷了,三个小时没检查出ql和qr弄反了。我简直受不了啊

//
//  main.cpp
//  hdu 2871 -Memory Control--线段树
//
//  Created by XD on 15/9/13.
//  Copyright (c) 2015年 XD. All rights reserved.
#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;
const int maxn = 50000*6 +10  ;
int ans ;
struct IntervalTree{
    int _set[maxn] , _pre[maxn] , _suffix[maxn],_sum[maxn] ;
    int ql ,qr , q,v,d;
    void init()
    {
        memset(_set, -1, sizeof(_set)) ;
        memset(_sum, 0, sizeof(_sum)) ;
    }
    void build(int o , int L , int R)
    {
        int lc = o *2 ; int rc = o *2 + 1 ;
        int m =  L + (R - L ) /2 ;
        if(L  < R )
        {
            _pre[o] = _suffix[o] = R - L + 1 ;
            build(lc, L  , m ) ;
            build(rc, m+1, R) ;
        }
        else{
            _suffix[o] = _pre[o] = 1 ;
        }
    }
    void pushdown(int o)
    {
        if(_set[o]>=0 )
        {
            _set[o*2] = _set[o*2+1] =_set[o] ;
            _set[o] = -1;
        }
    }
    void maintain(int o, int L ,int R)
    {
        int lc = o *2 ; int rc = o *2 +1 ;
        if(L < R )
        {
            int m = L + (R-L)/2 ;
            _sum[o] = _sum[lc] + _sum[rc] ;
            _pre[o] = _pre[lc] == m - L +1 ?_pre[lc] + _pre[rc] : _pre[lc] ;
            _suffix[o] = _suffix[rc] == R - m ? _suffix[lc] + _suffix[rc]:_suffix[rc] ;
        }
        if(_set[o] == 0 )
        {
            _sum[o] = 0 ;
            _suffix[o] = _pre[o] = R - L +1 ;
        }
        else if (_set[o] == 1 )
        {
            _sum[o] = R -L+1 ;
            _suffix[o] = _pre[o] = 0 ;
        }
    }
    void update(int o , int L ,int R)
    {
        int rc = o *2+1  ;int lc = o *2  ;
        if(ql <= L && qr >= R)
        {
            _set[o] = v  ;
        }
        else{
            pushdown(o)  ;
            int m = L + (R-L)/2 ;
            if(ql <= m ) update(lc, L  , m) ; else maintain(lc , L , m) ;
            if(qr > m ) update(rc,  m+1 , R) ; else maintain(rc, m+1, R) ;
        }
        maintain(o , L, R) ;
    }
    void getstart(int o , int  L ,int R)
    {
        if(R - L +1 <d || R - L + 1 - _sum[o] < d)
        {
            return ;
        }
        
        if(_sum[o]==0)
        {
            ans =  L ;
            return ;
        }
        int m =  L + (R -L) /2  ;
        int lc =  o*2 ; int rc = o*2 + 1 ;
        getstart(lc, L  , m) ;
        if(ans >  0 ) return ;
        if(_suffix[lc] + _pre[rc] >= d)
        {
            if(_suffix[lc] > 0 ) ans = m - _suffix[lc] +1 ;
            else ans = m+1 ;
            return ;
        }
        getstart(rc, m+1, R) ;
    }
};
IntervalTree tree ;
struct block
{
    int begin ,end ;
    block(int begin ,int end):begin(begin) ,end(end){} ;

    block(){} ;
    bool operator < (const block &n ) const{
        return  begin < n.begin ;
    } ;
};
vector<block> v ;
int main(int argc, const char * argv[]) {
    int  n , m,x,pos;
    char cmd[10] ;vector<block>::iterator it  ;
    while (scanf("%d%d" , &n,&m)==2&&n&&m) {
        v.clear() ;
        v.push_back(block(500001,0)) ;
        tree.init() ;
        tree.build(1, 1, n) ;
        for (int i = 0; i < m; i++) {
            scanf("%s" ,cmd) ;
            switch (cmd[0]) {
                case 'R':
                    tree.v = 0 ;
                    //一开始写成了ql = n , qr = 1 ,囧竟然3个小时没发现,我了个去
                    tree.ql= 1 ;tree.qr = n ;
                    tree.update(1, 1, n) ;
                    v.clear() ;
                    v.push_back(block(500001,0)) ;
                    printf("Reset Now\n") ;
                    break;
                case 'N':
                    scanf("%d" , &tree.d) ;
                    ans = 0 ;
                    tree.getstart(1, 1, n) ;
                    if(ans==0)
                    {printf("Reject New\n") ;break;}
                    it = upper_bound(v.begin() ,v.end() , block(ans ,0))  ;
                    v.insert(it, block(ans , ans + tree.d -1 )) ;
                    tree.v = 1 ;
                    tree.ql = ans ; tree.qr =ans  +tree.d -1  ;
                    tree.update(1, 1, n) ;
                    printf("New at %d\n" , ans) ;
                    break  ;
                case 'G':
                    scanf("%d" , &x) ;
//                    l  =getStart(x , n ) ;
                    if ( x<= v.size()-1)  {
                        printf("Get at %d\n" , v[x-1].begin) ;
                    }
                    else{
                        printf("Reject Get\n") ;
                    }
                    break ;
                case 'F':
                    scanf("%d" , &x) ;
//                    l = getStart(sum(x),n)  ;
                    it = upper_bound(v.begin() ,v.end() , block(x , 0)) ;
                    pos =(int)( it - v.begin() -1 );
                    if(pos == -1 || v[pos].end<x)
                    {
                        printf("Reject Free\n") ;
                    }
                    else{
                        printf("Free from %d to %d\n" , v[pos].begin, v[pos].end) ;
                        tree.v = 0 ; tree.ql = v[pos].begin ; tree.qr = v[pos].end;
                        tree.update(1, 1, n)  ;
                        v.erase(--it) ;
                    }
            }
        }
        cout<<endl ;
    }
    return 0;
}


【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领域的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究平台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水平来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
本软件实现了一种基于时域有限差分法结合时间反转算法的微波成像技术,旨在应用于乳腺癌的早期筛查。其核心流程分为三个主要步骤:数据采集、信号处理与三维可视化。 首先,用户需分别执行“WithTumor.m”与“WithoutTumor.m”两个脚本。这两个程序将在模拟生成的三维生物组织环境中进行电磁仿真,分别采集包含肿瘤模型与不包含肿瘤模型的场景下的原始场数据。所获取的数据将自动存储为“withtumor.mat”与“withouttumor.mat”两个数据文件。 随后,运行主算法脚本“TR.m”。该程序将加载上述两组数据,并实施时间反转算法。算法的具体过程是:提取两组仿真信号之间的差异成分,通过一组专门设计的数字滤波器对差异信号进行增强与净化处理,随后在数值模拟的同一组织环境中进行时间反向的电磁波传播计算。 在算法迭代计算过程中,系统会按预设的周期(每n次迭代)自动生成并显示三维模拟空间内特定二维切面的电场强度分布图。通过对比观察这些动态更新的二维场分布图像,用户有望直观地识别出由肿瘤组织引起的异常电磁散射特征,从而实现病灶的视觉定位。 关于软件的具体配置要求、参数设置方法以及更深入的技术细节,请参阅软件包内附的说明文档。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值