HNCU专题训练_线段树(2)
2013-08-04 16:15
295 查看
1.统计颜色,或运算的运用
2.区间第k大数
3.一个很经典的题
5.求区间相等数字的个数
6.RMQ模板题,区间最大值和最小值的差
1.很好的思路,用或运算来避免左右儿子树总相同颜色的情况。由于
T颜色种类最多30种,__int64 足够用了。
注意初始化就行。
5.关键是写对make_up()这个函数,向上更新需要考虑的问题。经典题型。
1001
View Code
2.区间第k大数
3.一个很经典的题
5.求区间相等数字的个数
6.RMQ模板题,区间最大值和最小值的差
1.很好的思路,用或运算来避免左右儿子树总相同颜色的情况。由于
T颜色种类最多30种,__int64 足够用了。
注意初始化就行。
5.关键是写对make_up()这个函数,向上更新需要考虑的问题。经典题型。
1001
/* 求区间[l,r],最大值和最小值的差值。 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define MAX 1000010 using namespace std; struct node { int l; int r; int min; int max; }f[50003*4]; int Date[50003]; int hmax(int x,int y) { return x>y? x:y; } int hmin(int x,int y) { return x>y? y:x; } void build(int l,int r,int n) { int mid=(l+r)/2; f .l=l; f .r=r; if(l==r) { f .max=Date[l]; f .min=Date[l]; return; } build(l,mid,n*2); build(mid+1,r,n*2+1); f .max=hmax(f[n*2].max,f[n*2+1].max); f .min=hmin(f[n*2].min,f[n*2+1].min); } void query(int l,int r,int *a,int *b,int n) { int mid=(f .l+f .r)/2; if(f .l==l && f .r==r) { if(f .min<*a) *a=f .min; if(f .max>*b) *b=f .max; return; } if(mid>=r) query(l,r,a,b,n*2); else if(mid<l) query(l,r,a,b,n*2+1); else { query(l,mid,a,b,n*2); query(mid+1,r,a,b,n*2+1); } } int main() { int N,Q,i; int a,b,l,r; while(scanf("%d%d",&N,&Q)>0) { for(i=1;i<=N;i++) scanf("%d",&Date[i]); build(1,N,1); while(Q--) { scanf("%d%d",&l,&r); a=MAX;b=-1; query(l,r,&a,&b,1); printf("%d\n",b-a); } } return 0; }
View Code
相关文章推荐
- 线段树专题训练
- 线段树专题训练
- 线段树专题#4_蒟蒻训练历程记录_HDU1698_ 延迟标记、区间更新
- 线段树专题#6_蒟蒻训练历程记录_HDU 2705 Billboard_单点更新
- 线段树专题#1_蒟蒻训练历程记录_HDU1166
- 线段树专题#2_蒟蒻训练历程记录_HDU5775
- 线段树专题#5_蒟蒻训练历程记录_HDU 1394 Minimum Inversion Number_单点更新+思维转换
- hdu线段树专题训练
- 线段树专题#3_蒟蒻训练历程记录_HDU1754_I hate It
- CUGB专题训练之数据结构:A - Balanced Lineup(线段树单点或RMQ)
- CUGB专题训练之数据结构:B - Count Color 线段树区间更新
- 蓝桥杯 算法训练 操作格子 (线段树)
- LA 3839 动态最大连续和(线段树)(训练指南)
- 训练指南——数学专题一的总结
- 【专题】权值线段树
- 数据结构专题——线段树
- 【 【henuacm2016级暑期训练】动态规划专题 G】 Palindrome pairs
- 英语六级翻译训练:教育专题
- 2016 SCUT 专题训练 简单dp
- 线段树专题【暂停更新中】