【HDU No. 1166】 敌兵布阵

news2024/11/25 6:34:30

【HDU No. 1166】 敌兵布阵

杭电 OJ 题目地址

在这里插入图片描述

【题意】

A国在海岸线沿直线布置了N 个工兵营地。C国通过先进的监测手段对A国每个工兵营地的人数都掌握得一清二楚。每个工兵营地的人数都可能发生变动,可能增加或减少若干人手。

【输入输出】

输入:

第1行包含一个整数T ,表示有T 组数据。每组数据的第1行都包含一个正整数N (N ≤50000),表示有N 个工兵营地。接下来有N 个正整数,第i 个正整数ai 代表第i 个工兵营地开始时有ai 个人(1≤ai ≤50)。再接下来每行都有一条命令,每组数据最多有40000条命令,命令有4种形式:①Add i j ,表示第i 个营地增加j 个人(j≤30);②Sub i j ,表示第i 个营地减少j 个人(j ≤30);③Query i j ,i ≤j ,表示查询第i ~j 个营地的总人数(int以内);④End,表示结束,在每组数据的最后出现。

命令中的i 和j 均为正整数。

输出:

对第i 组数据,首先单行输出“Case i:”,然后对每个Query都单行输出查询区间的总人数。

【样例】

在这里插入图片描述

【思路分析】

这道题包括点更新和区间查询,可以采用树状数组或者线段树解决。

【算法设计】

① 创建线段树,存储区间和。

② 点更新,查询到该点后进行点更新,返回时更新区间和。

③ 区间查询,首先查找该区间,然后返回区间和值。

创建线段树时可以采用存储区间信息和不存储区间信息两种方法,本题采用不存储区间信息的方法创建线段树,并对两种区间查询方法进行对比。

【创建线段树的两种方法】

创建线段树的方法不同,数据结构和区间查询时的参数也不同。

① 节点存储区间信息。每个节点都存储区间信息l 、r ,以及其他信息如最值或和值。在前面线段树的基本操作中就采用了这种方式,进行区间查询时只需3个参数:待查询区间L 、R 和当前节点的编号。

② 节点不存储区间信息。每个节点都不存储区间信息l、r ,用数组存储其他信息如最值或和值。进行区间查询时需要5个参数:待查询区间L 、R ;当前节点的l 、r ;当前节点编号rt 。节点不存储区间信息构建线段树的代码如下,区间查询的代码在后面给出。

#define lson l , m , rt << 1
#define rson m + 1, r, rt << 1 | 1

void build(int l , int r , int rt){ // 构建线段树
	
	if(l == r){
		scanf("%d" , &sum[rt]);
		return;
	}
	
	int m = (l + r) >> 1;
	build(lson);
	build(rson);
	sum[rt] = sum[rt * 2] + sum[rt * 2 + 1]; // 更新区间和
}

【 区间查询的两种方法】

无论采用哪种方法创建线段树,都可以采用区间覆盖和区间相等两种方法进行区间查询。以节点不存储区间信息的5个参数区间和查询为例,3个参数类似。

① 区间覆盖。判断条件为覆盖时,查询区间无须改变,一直是[L , R ],累加左右两个区间查询的和值。

int query(int L,int R,int l,int r,int rt)//区间查询1
{
    if (L<=l&&r<=R)// 判断条件为覆盖,查询区间[L, R] 覆盖当前节点区间[l ,r]
        return sum[rt];
    int m=(l+r)>>1;
    int ret=0; // 定义变量,分两种情况累加 区间和( 或者求最值)
    if(L<=m) ret+=query(L,R,lson);
    if(R>m) ret+=query(L,R,rson);
    return ret; // 返回结果
}

② 区间相等。判断条件为相等且跨两个区间查询时,左右子树的查询范围分别变为[L , m ]、[m +1, R ]。

int query(int L,int R,int l,int r,int rt){//区间查询2
    if(L==l&&r==R)//判断条件为相等,查询区间[L, R] 等于当前节点区间[l ,r]
        return sum[rt];
    int m=(l+r)>>1;
    if(R<=m) // 分三种情况直接返回结果
		return query(L,R,lson);
    else if(L>m)
			return query(L,R,rson);
    	else return query(L,m,lson)+query(m+1,R,rson); // 左右子树查询范围变为[L, m]、 [m + 1 , R]
}

【算法实现】

#include<cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int maxn=55555;

int sum[maxn<<2];

void PushUP(int rt){//更新和值
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void build(int l,int r,int rt){//构建线段树
    if(l==r){
	    scanf("%d",&sum[rt]);
	    return ;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    PushUP(rt);
}

void update(int p,int add,int l,int r,int rt){//单点更新
    if (l==r){
        sum[rt]+=add;
        return ;
	}
    int m=(l+r)>>1;
    if(p<=m) update(p,add,lson);
    else update(p,add,rson);
    PushUP(rt);
}


int query(int L,int R,int l,int r,int rt){//区间查询2
    if(L==l&&r==R)//判断条件为相等
        return sum[rt];
    int m=(l+r)>>1;
    if(R<=m)
		return query(L,R,lson);
    else if(L>m)
			return query(L,R,rson);
    	else return query(L,m,lson)+query(m+1,R,rson);
}

int main(){
	
    int T,n;
    scanf("%d",&T);
    
    for (int cas=1;cas<=T;cas++){
    	
        printf("Case %d:\n",cas);
        scanf("%d",&n);
        build(1,n,1);
        char op[10];
        while(scanf("%s",op)){
            if(op[0]=='E') break;
            int i,j;
            scanf("%d%d",&i,&j);
            if(op[0]=='Q') printf("%d\n",query(i,j,1,n,1));
            else if(op[0]=='S') update(i,-j,1,n,1);
                else update(i,j,1,n,1);
        }
    }
    
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识整理:1802907-99-8,Desthiobiotin-PEG4-Alkyne生物素类似物

&#xff08;本品应密封避光&#xff0c;储存于阴凉&#xff0c;干燥&#xff0c;通风处&#xff0c;取用一定要干燥&#xff0c;避免频繁的溶解和冻干&#xff09; ●中文名&#xff1a;脱硫生物素-四聚乙二醇-炔基 ●英文&#xff1a;Desthiobiotin-PEG4-Alkyne ●外观以及性…

浮点数渐进下溢

文章目录浮点数渐进下溢浮点数渐进下溢 当IEEE754浮点数的运算结果或转化结果中&#xff0c;存在阶码全0的情况时&#xff0c;在IEEE754标准的描述中说&#xff0c;若此时尾数不全为0&#xff0c;则表示次正规数&#xff0c;即次数浮点数的真值其实应该成为&#xff1a; (−1)…

YUV数据格式

1. YUV的原理 YUV 的原理是把亮度&#xff08;Luma&#xff09;与色度&#xff08;Chroma&#xff09;分离。 “Y”表示亮度&#xff0c;也就是灰度值。 “U”表示蓝色通道与亮度的差值。 “V”表示红色通道与亮度的差值。 其中 Y 信号分量除了表示亮度信号外&#xff0c;还含…

Redis学习笔记(一)

NoSQL 泛指非关系型数据库&#xff0c;作为关系型数据库的补充作用&#xff1a;应对海量用户和海量数据前提下的数据处理问题特征 可扩容、可伸缩大数据量下高性能灵活的数据模型高可用 常见的NoSQL数据库 RedismemcacheHBaseMongoDB Redis 一种高性能键值对数据库特征 数据间…

[附源码]计算机毕业设计springboot酒店在线预约咨询小程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

STL 迭代器萃取

导言 什么是迭代器 迭代器是一种抽象的设计概念&#xff0c;《Design Patterns》一书中对于 iterator 模式的定义如下&#xff1a;提供一种方法&#xff0c;使之能够依序巡访某个聚合物&#xff08;容器&#xff09;所含的各个元素&#xff0c;而又无需暴露该聚合物的内部表述…

wcdma基站的重选和切换

首先移动组网的特点&#xff0c;单个基站覆盖一定区域范围&#xff0c;我们称之为小区&#xff0c;为了组成一个连续服务不断的网&#xff0c;需要在空间上部署多个基站&#xff0c;应对用户的移动。 为了实现业务的连续性&#xff0c;必须给每个小区设置相邻的小区&#xff0c…

C/C++-指针

C/C-指针参考1. 指针指针与内存/地址指针使用2.数组指针数组/指针/sizeof一维数组与指针多维数组指针3.字符/字符串指针4. 其他指针二级指针 -- 还没看空指针void指针野指针5.指针与函数函数指针引用传递指针函数6.结构体指针结构体数组指针???c 对象指针参考 https://www.…

Kotlin 开发Android app(十四):startActivity跳转Activity活动

从一个Activity跳到另一个Activity 在编写安卓代码是最常见的事情了。我们不可能在一个页面中&#xff0c;把所有的事情都做完。 在kotlin中跳转的程序也比较简单&#xff0c;跟java差不多。如果熟悉java代码的话&#xff0c;只需要把代码改变过来而已。 带参数的调整 从一个…

极空间Docker安装Alist套件整合阿里云盘、百度云盘等网盘资源并挂载到本地供极影视刮削播放完整教程

文章目录0、前言1、在docker中安装alist套件1.1、拉取并下载alist镜像1.2.安装alist镜像2、访问并设置alist2.1、访问alist2.2、配置alist2.2.1、在alist中添加阿里云盘2.2.2、在alist中添加其它网盘3、在极空间中将前述网盘挂载到本地4、在极影视中扫描刮削挂载到本地的云盘中…

如何制作一个微信小程序【微信小程序是怎么做的】

为什么现在这么多人使用微信小程序呢&#xff1f;因为微信小程序除了便捷易开发&#xff0c;公司企业可以用来做小程序展示官网&#xff0c;商家也可以做小程序商城&#xff0c;甚至个人也可以拥有自己的小程序。那么如何制作一个微信小程序&#xff1f;微信小程序是怎么做的呢…

第二证券|房地产股债嗨了,百余只个股谁受热捧?谁还受益?

29日&#xff0c;AH股房地产板块狂飙&#xff0c;地产债反常火热。 A股地产股开盘即掀涨停潮&#xff0c;中国武夷、中交地产、空港股份、光大嘉宝、中华企业等超10股竞价涨停。港股内房股大幅高开&#xff0c;碧桂园、富力地产、新城开展等多股涨超10%&#xff0c;盘中三巽集…

Crack:Stimulsoft BI Server 2022.4.5

Stimulsoft BI Server 是一个客户端-服务器系统&#xff0c;可让您高效且有效地实施使用报告和仪表板的完整周期&#xff0c;从执行信息处理任务的设计和自动化开始&#xff0c;到为方便地向用户展示结果做准备结束。报告模块的功能和功能是使用 Stimulsoft 的快速现代技术实现…

一、Vue3基础[组件(props、事件、插槽)]

一、组件化 解释:正如上图所示,一个页面可以分为多块部分,但是如果把所有代码都写在一个vue文件当中,维护性和可读性都会很差,所以需要用到组件化思维->创建多个vue文件每个里面写一部分代码,然后集中在一个主的vue文件调用 二、组件的注册 1.全局 解释:顾名思义,…

【Java盲点攻克】「时间与时区系列」让我们一起完全吃透对于时区和日期相关的功能开发原理

技术简介 java中的日期处理一直是个问题&#xff0c;没有很好的方式去处理&#xff0c;所以才有第三方框架的位置比如joda。文章主要对java日期处理的详解&#xff0c;用1.8可以不用joda。 时间概念 首先我们对一些基本的概念做一些介绍&#xff0c;其中可以将GMT和UTC表示时…

自然算法 - AI面试基础补全

手撕BP神经网络手写Bert和Transformer&#xff08;BERT很细节的地方&#xff0c;比如文字标签CLS&#xff0c;par&#xff09;学习pytorch&#xff0c;tensorflow AI算法岗位 可看网站 牛客网站 面经回复 github 项目连接 算法工程师岗位必备知识 问答 ELMO、GPT、…

Linux系统下KVM虚拟机的基本管理和操作

Linux系统下KVM虚拟机的基本管理和操作一、检查本地环境1.检查系统版本2.检查防火墙状态3.检查selinux3.检查libvirtd服务状态4.检查kvm安装结果5.检查kvm虚拟机状态6.检查virsh版本二、virsh常用命令1.列出虚拟机2.虚拟机开关机操作3.删除虚拟机4.设置虚拟机在宿主机开机时自启…

装在笔记本里的私有云环境:K8s 集群准备

本篇是系列中的第六篇内容&#xff0c;继续聊聊如何把一个简化过的私有云环境部署在笔记本里&#xff0c;以满足低成本、低功耗、低延时的实验环境。 在前几篇内容中&#xff0c;我们聊过了&#xff1a;虚拟化、监控、基础的存储、持续集成等内容&#xff0c;接下来的内容中&a…

告诉你如果对一个新产品进行测试

初入一家公司&#xff0c;当一个全新的产品摆在你的面前&#xff0c;你会如何快速入手呢&#xff1f;点、点、点。。。虽说实践是熟悉系统的第一要素&#xff0c;但我们需要静静思考一下。我是谁&#xff1f;--QA我在哪&#xff1f;--**产品组我要做什么&#xff1f;--保质量有…

Nature:“我还有用!“凋亡细胞释放的代谢物充当组织信使

代谢组学文献分享&#xff0c;细胞凋亡是指为维持内环境稳定&#xff0c;由基因控制的细胞自主的有序的死亡。2002年授予在“发现细胞凋亡的重要调控分子并阐述其作用机制”方面做出重要贡献的三位科学家诺贝尔生理和医学奖&#xff0c;caspase依赖的细胞凋亡约占机体内稳态细胞…