线段树
来源:互联网 发布:小米怎么看网络制式 编辑:程序博客网 时间:2024/05/18 02:43
struct Tnode{
int l,r;//区间[l,r]
int max;//区间[l,r]的最大值
int lc,rc;//左孩子和右孩子
};Tnode f[1000007];
const int oo=0x7fffffff/3;
int fp=0;
int petPoint(int l,int r,int max)//建立一个点,相当于new
{
fp++;
f[fp].l=l;
f[fp].r=r;
f[fp].max=max;
return fp;
}
int create(int l,int r)
{
int now = petPoint(l,r,-oo);
if(l<r)//递归,如果合法就递归
{
f[now].lc=create( l , (l+r) /2 );//左
f[now].rc=create( (l+r) /2+1, r );//右
}
return now;
}
void update(int root, int p, int v)//修改一个数
{
int l=f[root].l,r=f[root].r;
if(p<l || p>r) return ;//p不在这个区间
if(l==r) { f[root].max= v; return; }//相等的只有最后一层才有,而且在区间内,直接赋值就可以了
update(f[root].lc, p, v);//向左递归
update(f[root].rc, p ,v);//向右递归
f[root].max=max(f[ f[root].lc ].max , f[ f[root].rc ].max );//维护最大值信息
}
int query(int root, int l, int r)//查询最大值
{
if(l>f[root].r || r<f[root].l) return 0; //区间没有关联
if(l<=f[root].l && r>=f[root].r) return f[root].max;//包含
int ans=-oo;
ans=max(ans, query( f[root].lc, l, r) );//向左递归
ans=max(ans, query( f[root].rc, l, r) );//向右递归
return ans;
}
#include<cstdio>
#include<iostream>
using namespace std;
const int oo=0;
struct Tnode{
int l,r;
int max;
int lc,rc;
};
Tnode f[10000];
int i,t;
int n,m,fp=0;
int petPoint(int l,int r,int max)//建立一个点,相当于new
{
fp++;
f[fp].l=l;
f[fp].r=r;
f[fp].max=max;
return fp;
}
int create(int l,int r)
{
int now = petPoint(l,r,-oo);
if(l<r)//递归,如果合法就递归
{
f[now].lc=create( l , (l+r) /2 );//左
f[now].rc=create( (l+r) /2+1, r );//右
}
return now;
}
int query(int root, int l, int r)//查询最大值
{
if(l>f[root].r || r<f[root].l) return 0; //区间没有关联
if(l<=f[root].l && r>=f[root].r) return f[root].max;//包含
int ans=-oo;
ans=max(ans, query( f[root].lc, l, r) );//向左递归
ans=max(ans, query( f[root].rc, l, r) );//向右递归
return ans;
}
void update(int root, int p, int v)//修改一个数
{
int l=f[root].l,r=f[root].r;
if(p<l || p>r) return ;//p不在这个区间
if(l==r) { f[root].max= v; return; }//相等的只有最后一层才有,而且在区间内,直接赋值就可以了
update(f[root].lc, p, v);//向左递归
update(f[root].rc, p ,v);//向右递归
f[root].max=max(f[ f[root].lc ].max , f[ f[root].rc ].max );//维护最大值信息
}
int main()
{
int l,r;
scanf("%d",&n);
int root = create(1,n);//建立一棵树
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&t);
if(t==0) //区间最值
{
scanf("%d%d",&l,&r);
printf("%d\n",query (root, l, r) );
}
else//修改
{
scanf("%d%d",&l,&r);
update(root,l,r);
}
}
return 0;
}
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 拓扑排序
- Noip2015普及组第四题 Salesman的解题报告
- Android 中的 Service 全面总结
- 最短路径(未完成)
- 树状数组
- 线段树
- 最长不下降子序列
- iOS Keychain (钥匙串)简单封装
- 欢迎使用CSDN-markdown编辑器
- 逆序对
- 二叉堆
- USACO 2016 JAN——Angry Cows套题的解题报告
- mac下 git简单的安装,配置,操作
- 2009南海区集训队初中选拔题1的解题报告