hdu 1754 I Hate It (线段树)
2024-09-06 10:35:16
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
线段树的模板题,详细的都写在代码里了
//不知道为什么定义单个字符,用%c输入会超时,换成字符数组和%s就过了
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
using namespace std;
int tree[],num[];
void build(int i ,int j, int k)
{
//建树,将1-n 2分分配给子节点,最后在给最终的节点赋值
if(j==k)
{
tree[i]=num[j];
return ;
}
int mid =(j+k)>>;
build(i<<,j,mid);
build(i<<|,mid+,k);
tree[i]=max(tree[i<<],tree[i<<|]);
}
void add(int i,int x, int j ,int k,int p)
{
//维护 从头寻找要改变的节点,找到后再依次返回父节点进行维护
if (j==k)
{
tree[i]=p;
return ;
}
int mid =(j+k)>>;
if(x<=mid)
add(i<<,x,j,mid,p);
else
add(i<<|,x,mid+,k,p);
tree[i]=max(tree[i<<],tree[i<<|]);
}
int finds(int i,int x, int y, int j, int k)
{
//查询 寻找符合要求的节点
if(x<=j && y>=k)
return tree[i];
int mid=(j+k)>>;
if(y<=mid)
return finds(i<<,x,y,j,mid);
else if(x>mid)
return finds(i<<|,x,y,mid+,k);
else
return max(finds(i<<,x,y,j,mid),finds(i<<|,x,y,mid+,k));
}
int main ()
{
int n,m,i,t,j,k,x,y;
char str[]; //这里不用字符数组不知道为什么莫名其妙的超时
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=;i<=n;++i)
scanf("%d",&num[i]);
build(,,n);
while(m--)
{
scanf("%s %d %d",str,&x,&y);
if(str[]=='Q'){
t=finds(,x,y,,n);
printf("%d\n",t);
}
else if (str[]=='U')
add(,x,,n,y);
}
}
return ;
}
最新文章
- 【转】Java面试题全集2.2(上)
- php-sql-parser sql防注入脚本
- [USACO2009 NOV GOLD]奶牛的图片
- java基础知识回顾之java Thread类学习(十二)-- 线程中断
- 使用 IL 实现类型转换
- ActionController::InvalidAuthenticityToken 解决办法(第二种尤其有效)
- 修改Input中Placeholder默认提示颜色(兼容)
- 使用netcat进行反弹链接的shellcode
- ltt.js
- 理解 MEF
- VMware 虚拟机(linux)增加根目录磁盘空间 转自
- ARM-LINUX学习笔记-(虚拟机linux串口终端以及USB程序下载,基于TQ2440)
- iconfont 使用
- 还在用Json完成Ajax,改用Beetl吧
- 迅为iTOP-4418/6818开发板-驱动-实现GPIO扩展
- C# - LINQ 表达式树
- STM32串口空闲中断
- Linux环境下虚拟环境virtualenv安装和使用
- Unity Ragdoll 实现死亡效果 心得+坑点总结
- Lerning Entity Framework 6 ------ Complex types