8.8线段树和树状数组
题目链接 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28619#overview
密码 acmore
还是感觉不怎么会线段树,还是得给自己另外多找点题目练练
Problem A HDU 3874
Necklace
树状数组+离线操作见http://www.cnblogs.com/gj-Acit/p/3249827.html
Problem B HDU 2227
Find the nondecreasing subsequences
见http://www.cnblogs.com/gj-Acit/p/3258508.html
Problem C HDU 1541
Stars
题目意思是说给出一些星星的坐标,他们每个星星的等级是按照每个星星左下方星星的数目来定的,即所有点中满足x<x0,y<y0的点的数目就是这个店的等级。求每个等级的星星有多少个。
由于题目给出的坐标中y是按照升序给出的,所以我们只需要每输入一个坐标,就先查询它的x坐标的前方有多少个点,再将这个点插入到坐标轴中去,这样的话就可以保证每次查询的都是当前点的左下方的点的数目。这样的话就可以用树状数组来记录从1~x的区间内有多少个已经被标记的点。
1 #include <stdio.h> 2 #include <string.h> 3 #define mem(a) memset(a,0,sizeof(a)) 4 #define MAX(a , b) ((a) > (b) ? (a) : (b)) 5 6 int TreeArray[32005], N; 7 int ans[32005]; 8 int X[15005], Y; 9 10 int LowBit(int x) 11 { 12 return x&(-x); 13 } 14 15 int GetSum(int k)//返回区间1~k有多少个点 16 { 17 int sum = 0; 18 while(k>=1) 19 { 20 sum += TreeArray[k]; 21 k -= LowBit(k); 22 } 23 return sum; 24 } 25 26 void Edit(int k,int Len)//插入一个点 27 { 28 while(k<=Len) 29 { 30 TreeArray[k] += 1; 31 k += LowBit(k); 32 } 33 } 34 35 int main() 36 { 37 while(~scanf("%d", &N)) 38 { 39 mem(ans); mem(TreeArray); 40 mem(X); 41 int Max = 0; 42 for(int i=1;i<=N;i++) 43 { 44 scanf("%d%d", &X[i], &Y);//其实不用吧每个点记录下来,可以每次都直接在区间1~32000内查找 45 X[i]+=1;//由于题目说x有可能为0,而树状数组不可以记录点0,所以全部的x都+1 46 Max = MAX(X[i], Max);//我是想要找出区间最大坐标,然后在1到最大区间内查询 47 } 48 for(int i=1;i<=N;i++) 49 { 50 ans[GetSum(X[i])]++;//先查询 51 Edit(X[i], Max);//后把点插入到坐标中去 52 } 53 for(int i=0;i<N;i++) 54 { 55 printf("%d\n", ans[i]); 56 } 57 } 58 return 0; 59 }
Problem D HDU 1754
I Hate It
线段树的基本操作,区间查询和节点修改
虽然此题比较简单,但是有一点学到的就是代码风格,要学会尽量让代码清晰易懂
1 #include <stdio.h> 2 #include <string.h> 3 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 4 #define mem(a) memset(a, 0, sizeof(a)) 5 #define lson k<<1, l, mid 6 #define rson k<<1|1, mid+1, r 7 #define MAXN 200005 8 9 int Max[MAXN<<2], N, M; 10 11 void edit(int k, int l,int r, int num, int v) 12 { 13 if(l == r) 14 { 15 Max[k] = v; 16 return ; 17 } 18 int mid = (l+r)>>1; 19 if(num <= mid)edit(lson, num, v); 20 else edit(rson, num, v); 21 Max[k] = MAX(Max[k<<1], Max[k<<1|1]); 22 } 23 24 int query(int k,int l,int r,int L,int R) 25 { 26 if(L<=l && r<=R)return Max[k]; 27 int mid = (l+r)>>1, Lans=0, Rans =0; 28 if(L <= mid) Lans = query(lson, L, R); 29 if(R > mid) Rans = query(rson, L, R); 30 return MAX(Lans, Rans); 31 } 32 33 int main() 34 { 35 while(~scanf("%d %d", &N, &M)) 36 { 37 int A, B; 38 char ch; mem(Max); 39 for(int i=1;i<=N;i++) 40 { 41 scanf("%d%*c", &A); 42 edit(1,1,N,i,A); 43 } 44 for(int i=0;i<M;i++) 45 { 46 scanf("%c %d %d%*c", &ch, &A, &B); 47 if(ch == 'Q') printf("%d\n", query(1,1,N,A,B)); 48 else edit(1,1,N,A,B); 49 } 50 } 51 return 0; 52 }
Problem E POJ 3264
Balanced Lineup
一样都是基本操作
1 #include <stdio.h> 2 #include <string.h> 3 #define INF 1000010 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define lson k<<1, l, mid 6 #define rson k<<1|1,mid+1, r 7 #define MAX(a,b) (a>b?a:b) 8 #define MIN(a,b) (a<b?a:b) 9 #define MAXN 50005 10 11 int minH[MAXN<<2], maxH[MAXN<<2]; 12 int N, M; 13 14 void init() 15 { 16 for(int i=0;i<=(N<<2);i++) 17 { 18 minH[i] = INF; 19 maxH[i] = -INF; 20 } 21 } 22 23 void edit(int k,int l,int r,int num, int val) 24 { 25 if(l==r){ 26 minH[k] = maxH[k] = val; 27 return ; 28 } 29 int mid = (l+r)>>1; 30 if(num <= mid) edit(lson, num, val); 31 else edit(rson,num,val); 32 minH[k] = MIN(minH[k<<1], minH[k<<1|1]); 33 maxH[k] = MAX(maxH[k<<1], maxH[k<<1|1]); 34 } 35 36 int query(int k,int l,int r,int L,int R,int IsMin) 37 { 38 if(L<=l && r<=R) return IsMin ? minH[k] : maxH[k]; 39 int mid = (l+r)>>1, Lval=INF, Rval=INF; 40 if(L <= mid) Lval = query(lson,L,R,IsMin); 41 if(R > mid) Rval = query(rson,L,R,IsMin); 42 if(IsMin) return MIN(Lval, Rval); 43 return MAX((Lval==INF?-INF:Lval), (Rval==INF?-INF:Rval)); 44 } 45 46 int main() 47 { 48 while(~scanf("%d%d", &N, &M)) 49 { 50 init(); int h; 51 for(int i=1;i<=N;i++) 52 { 53 scanf("%d", &h); 54 edit(1,1,N,i,h); 55 } 56 int A, B; 57 for(int i=0;i<M;i++) 58 { 59 scanf("%d %d", &A, &B); 60 printf("%d\n", query(1,1,N,A,B,0) - query(1,1,N,A,B,1)); 61 } 62 } 63 return 0; 64 }
Problem G POJ 2299
Ultra-QuickSort
见http://www.cnblogs.com/gj-Acit/p/3250525.html
转载于:https://www.cnblogs.com/gj-Acit/p/3249298.html
8.8线段树和树状数组相关推荐
- 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)
解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...
- 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大
题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax为yyy 解题思路: 首先我们知道权值线段树是 ...
- poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★
poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...
- 线段树/树状数组问题 | 问题集合
写在前面 线段树代码实在冗长,于是乎能用树状数组直接搞的就懒得打线段树了(:溜 1.P2620[QZYZ] 校门外的树 描述 Description 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有 ...
- 花神游历各国 题解(小清新线段树/树状数组+并查集)
题面 众所周知,这是一道小清新线段树 然而可以用树状数组水过去且跑得飞快 看到区间开方第一反应肯定是线段树懒标记区间修改之类的,但是这个东西似乎确凿不可维护 所以考虑暴力循环单点修改->T飞 于 ...
- LeetCode Range Sum Query - Mutable(树状数组、线段树)
问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...
- hdu 4417(线段树OR树状数组)
题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...
- 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...
- hdu2492 数状数组或者线段树
题意: 给你一些人,每个人有自己的攻击力,输入的顺序就是每个人的顺序,他们之间互相比赛,两个人比赛的条件是必须在他们两个位置之间找到一个人当裁判,这个裁判的攻击力必须在他们两个人之间,问你最 ...
最新文章
- 1月4日链接篇:ASP.NET, ASP.NET AJAX, ASP.NET MVC, Visual Studio, IIS7
- Linux中文件操作
- 使用Spring AOP和番石榴速率限制器的节气门方法
- leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)
- [教程]博客园插入视频教程
- 计算机网络中使用最广泛的交换技术是什么,04741计算机网络原理试题及答案201604...
- jq判断是否为整数_五种js判断是否为整数(转)
- [专栏精选]UnityWebRequest详解
- phpthink验证旧密码_忘记MacBook密码解决方法
- idea-解决安装及各种问题
- Map,List,Queue,Set和Stack的区别
- python读取fiddler_Python3.x+Fiddler抓取APP数据
- 单片机原理及应用程序c语言版题库,单片机原理及应用期末复习题库(含答案)...
- 车牌识别算法介绍与实践
- ANDROID 有关高德地图 导航SDK 组件不见的问题
- 导致锁表的原因及解决方法
- 悲观并发控制(Pessimistic Concurrency)
- 叉乘点乘混合运算公式_初中数学根式运算法则公式
- Java获取单个字符的方法
- CREO工程截面图如何一键去掉除截面后面多余的线
热门文章
- cp: /usr/bin/chromedriver: Operation not permitted
- 电脑如何格式化_分别手把手教你在Windows和mac上格式化磁盘
- python知识点:文件读写以及其他基础知识点
- Linux 关机命令介绍shutdown
- 单片机有啥用?现在用的还多吗?
- java 两份文档相似性_两个数据集之间的相似百分比
- 模板 - 上下界网络流
- 模板 - 有向图的连通性
- springboot+shiro使用权限注解问题_无法使用注解_使用注解无法跳转无权限页面
- 添加议题模块html,WordPress 技巧:为评论模块增加更多 HTML 标签支持