HDU 1754 I Hate It(线段数-单点更新)
原题链接:I Hate It
题目分析:这个是线段树的基本操作——更新和查询,属于基础题,也就相当于一个模板吧,这里就不再多说了。
代码如下:
(PS:特别注意——输入输出用 不然会超时)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXNODE = 524288/*2097152*/;
const int MAX = 200001/*1000003*/;
struct NODE {
int value; // 结点对应区间的权值
int left,right; // 区间 [left,right]
} node[MAXNODE];
int father[MAX]; // 每个点(当区间长度为0时,对应一个点)对应的结构体数组下标
void BuildTree(int i, int left, int right) { // 为区间[left,right]建立一个以i为祖先的线段树,i为数组下标,我称作结点序号
node[i].left = left; // 写入第i个结点中的 左区间
node[i].right = right; // 写入第i个结点中的 右区间
node[i].value = 0; // 每个区间初始化为 0
if (left == right) { // 当区间长度为 0 时,结束递归
father[left] = i; // 能知道某个点对应的序号,为了更新的时候从下往上一直到顶
return;
}
// 该结点往 左孩子的方向 继续建立线段树,线段的划分是二分思想,如果写过二分查找的话这里很容易接受
// 这里将 区间[left,right] 一分为二了
BuildTree(i << 1, left, (int)floor((right + left) / 2.0));
// 该结点往 右孩子的方向 继续建立线段树
BuildTree((i << 1) + 1, (int)floor((right + left) / 2.0) + 1, right);
}
void UpdataTree(int ri) { // 从下往上更新(注:这个点本身已经在函数外更新过了)
if (ri == 1) return; // 向上已经找到了祖先(整个线段树的祖先结点 对应的下标为1)
int fi = ri / 2; // ri 的父结点
int a = node[fi << 1].value; // 该父结点的两个孩子结点(左)
int b = node[(fi << 1) + 1].value; // 右
node[fi].value = (a > b) ? (a) : (b); // 更新这个父结点(从两个孩子结点中挑个大的)
UpdataTree(ri / 2); // 递归更新,由父结点往上找
}
int Max /*= -1 << 20*/;
void Query(int i, int l, int r) { // i为区间的序号(对应的区间是最大范围的那个区间,也是第一个图最顶端的区间,一般初始是 1 啦)
if (node[i].left == l && node[i].right == r) { // 找到了一个完全重合的区间
Max = (Max < node[i].value) ? node[i].value : (Max);
return;
}
i = i << 1; // get the left child of the tree node
if (l <= node[i].right) { // 左区间有涉及
if (r <= node[i].right) // 全包含于左区间,则查询区间形态不变
Query(i, l, r);
else // 半包含于左区间,则查询区间拆分,左端点不变,右端点变为左孩子的右区间端点
Query(i, l, node[i].right);
}
i += 1; // right child of the tree
if (r >= node[i].left) { // 右区间有涉及
if (l >= node[i].left) // 全包含于右区间,则查询区间形态不变
Query(i, l, r);
else // 半包含于左区间,则查询区间拆分,与上同理
Query(i, node[i].left, r);
}
}
int main() {
int n, m, Value;
while (scanf("%d %d", &n, &m) != EOF) {
BuildTree(1, 1, n);
for (int i = 1; i <= n; i++) {
scanf("%d", &Value);
node[father[i]].value = Value; // 底层的无条件更新成绩
UpdataTree(father[i]);
}
while (m--) {
char ch[2];
int a, b;
scanf("%s %d %d", ch, &a, &b);
if (ch[0] == 'Q') {
Max = 0;
Query(1, a, b);
printf("%d\n", Max);
} else {
node[father[a]].value = b; // 底层的无条件更新成绩
UpdataTree(father[a]);
}
}
}
return 0;
}
HDU 1754 I Hate It(线段数-单点更新)的更多相关文章
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- HDU 1754 I Hate It 线段树(单点更新,成段查询)
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: #include<iostream> ...
- hdu 1754 I Hate It 线段树 单点更新 区间最值
线段树功能:update:单点更新 query:区间最值 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define r ...
- HDU 1754 I Hate It 线段树 单点更新 区间最大值
#include<iostream> #include<string> #include<algorithm> #include<cstdlib> #i ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新,区间查询)
描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1754 I Hate It(线段树单点替换+区间最值)
I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...
随机推荐
- 车载以太网第二弹|测试之实锤 -DoIP测试开发实践
前言 车载以太网测试之实锤系列,之前我们已经从环境设备组成.被测对象组成再到测试过程和测试结果分析,分享了完整的PMA测试 .IOP测试 .TC8中的TCP/IP协议一致性测试 .也分享了1000BA ...
- cmd窗口连接mongodb服务端
1----->配置环境变量,将mongodb\bin目录配置到path 2----->打开cmd窗口,进入到bin目录,测试mongodb服务端是否在运行:net start mongod ...
- 使用NTP原理进行时间同步
在一些物联网企业,平台会和嵌入式一起配合进行工作. 有时平台会希望嵌入式这边不使用现成的NTP方案自己去同步时间,而希望以平台下发的时间为准. 此时就有两个方案. 方案1. 平台下发一个时间戳tim ...
- .Net Core服务诊断排查
前言: 近期在项目中出现了几次服务内存资源占用较高的情况,特回顾梳理下排查过程以及对相应问题的排查方法总结. 一.Dump抓取 抓取dump的方式有多种,下面介绍几种常用的: 1. 任务管理器中找到程 ...
- java 输入输出 对象序列化implements Serializable与反序列化:ObjectOutputStream.writeObject() ;objectInputStream.readObject() ;serialVersionUID字段注意
对象序列化 对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象.对象序列化机制允许把内存中的 Java 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将 ...
- 优化vue+springboot项目页面响应时间:waiting(TTFB) 及content Download
优化vue+springboot项目页面响应时间:waiting(TTFB) 及content Download TTFB全称Time To First Byte,是指网络请求被发起到从服务器接收到地 ...
- OnZoom 基于Apache Hudi的流批一体架构实践
1. 背景 OnZoom是Zoom新产品,是基于Zoom Meeting的一个独一无二的在线活动平台和市场.作为Zoom统一通信平台的延伸,OnZoom是一个综合性解决方案,为付费的Zoom用户提供创 ...
- 【LeetCode】17. Letter Combinations of a Phone Number 电话号码的字母组合
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:电话号码, 字母组合,回溯法,题解,leetcode, ...
- 【LeetCode】494. Target Sum 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- Docker 与 K8S学习笔记(八)—— 自定义容器网络
我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...