线段树三:求任意区间的最值
来源:互联网 发布:淘宝小玄子家是正品吗 编辑:程序博客网 时间:2024/05/23 23:38
从做这几个题目我发现了,能调用库函数的尽量调用库函数,不然的话可能会超时。不信可以试,在题1的头文件下定义宏:
#define min(a,b) (a)<(b)?(a):(b)
在题2中定义宏:
#define max(a,b) (a)>(b)?(a):(b)
题1:Tyvj 1038(忠诚),给定区间求最小值。只需更改Query即可,由于没有修改操作,可以删除Update操作。
#include<iostream>#include<cstring>#include<cstdio> #include<cmath> using namespace std;const int MAX=100010;const int Inf=100000000;//#define min(a,b) (a)<(b)?(a):(b) 不要加这个,加后会超时 #define Lson L,mid,root<<1#define Rson mid+1,R,root<<1|1int n,m,Min[MAX<<2];int Pushup(int root) { Min[root]=min(Min[root<<1],Min[root<<1|1]);}void Build(int L,int R,int root){ if(L==R) { scanf("%d",&Min[root]); return ; } int mid=(L+R)>>1; Build(Lson); Build(Rson); Pushup(root); }int Query(int ql,int qr,int L,int R,int root) { if(ql<=L && R<=qr) return Min[root]; int mid=(L+R)>>1; int res=Inf; if(ql<=mid) res=min(res,Query(ql,qr,Lson)); if(qr>mid) res=min(res,Query(ql,qr,Rson)); return res;}int main(){ int a,b; scanf("%d%d",&n,&m); Build(1,n,1); for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); printf("%d\n",Query(a,b,1,n,1)); } return 0;}
例题2:HDU 1754(I hate it),给定区间求最大值,记得update中只是更新该结点的值。
#include<iostream>#include<cstring>#include<cstdio> #include<cmath> using namespace std;const int MAX=200010;//#define max(a,b) (a)>(b)?(a):(b) 不要加这个,加后会超时 #define Lson L,mid,root<<1#define Rson mid+1,R,root<<1|1int n,m,Max[MAX<<2];int Pushup(int root) { Max[root]=max(Max[root<<1],Max[root<<1|1]);}void Build(int L,int R,int root){ if(L==R) { scanf("%d",&Max[root]); return ; } int mid=(L+R)>>1; Build(Lson); Build(Rson); Pushup(root); }void Update(int q,int val,int L,int R,int root){ if(L==R) { Max[root]=val; return ; } int mid=(L+R)>>1; if(q<=mid) Update(q,val,Lson); else Update(q,val,Rson); Pushup(root);}int Query(int ql,int qr,int L,int R,int root) { if(ql<=L && R<=qr) return Max[root]; int mid=(L+R)>>1; int res=0; if(ql<=mid) res=max(res,Query(ql,qr,Lson)); if(qr>mid) res=max(res,Query(ql,qr,Rson)); return res;}int main(){ int a,b; while(~scanf("%d%d",&n,&m)) { Build(1,n,1); char op[5]; getchar(); while(m--) { scanf("%s%d%d",op,&a,&b); if(op[0]=='U') Update(a,b,1,n,1); if(op[0]=='Q') printf("%d\n",Query(a,b,1,n,1)); } } return 0;}
- 线段树三:求任意区间的最值
- 线段树求区间最值
- 线段树求区间最值
- POJ2823(线段树求区间最值)
- POJ2823 - 线段树求区间的最值..
- UESTC 1425 求任意区间的LIS 线段树区间更新区间查询
- 线段树一:修改点的值求任意区间的值
- 线段树二:修改区间的值求任意点的值
- 线段树一:修改点的值求任意区间的值
- hdu1754 求区间最值 线段树 树状数组
- poj 2823 线段树求区间最值
- poj 3875 RMQ或线段树求区间最值
- hdu_1754,线段树单点更新,求区间最值
- hdu1754 I Hate It 线段树求区间最值
- LightOJ Array Queries 1082【线段树求区间最值】
- HDU1754 线段树 + 裸 + 单点更新求区间最值
- 【线段树求区间最值】玲珑oj 1128
- POJ 3264 Balanced Lineup 求线段树区间最值
- paip.提升开发效率---事件化V0829
- zju 3633...
- udev无法挂载设备名sda的U盘
- 持续集成学习笔记-入门篇(4)持续集成自动化(一):所谓“关键”问题
- Ruby Fiber指南(二)参数传递
- 线段树三:求任意区间的最值
- 关于hashtable 锁的问题
- poj 1228(凸包)
- 策略模式
- itoa函数
- IOS-路径大全
- Ubuntu安装飞鸽
- 关于网站的排名策略
- Ruby Fiber指南(三)过滤器