题目链接   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线段树和树状数组相关推荐

  1. 树套树 ----- 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],我们要减去[ ...

  2. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  3. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  4. 线段树/树状数组问题 | 问题集合

    写在前面 线段树代码实在冗长,于是乎能用树状数组直接搞的就懒得打线段树了(:溜 1.P2620[QZYZ] 校门外的树 描述 Description 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有 ...

  5. 花神游历各国 题解(小清新线段树/树状数组+并查集)

    题面 众所周知,这是一道小清新线段树 然而可以用树状数组水过去且跑得飞快 看到区间开方第一反应肯定是线段树懒标记区间修改之类的,但是这个东西似乎确凿不可维护 所以考虑暴力循环单点修改->T飞 于 ...

  6. LeetCode Range Sum Query - Mutable(树状数组、线段树)

    问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...

  7. hdu 4417(线段树OR树状数组)

    题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...

  8. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...

  9. hdu2492 数状数组或者线段树

    题意:      给你一些人,每个人有自己的攻击力,输入的顺序就是每个人的顺序,他们之间互相比赛,两个人比赛的条件是必须在他们两个位置之间找到一个人当裁判,这个裁判的攻击力必须在他们两个人之间,问你最 ...

最新文章

  1. 1月4日链接篇:ASP.NET, ASP.NET AJAX, ASP.NET MVC, Visual Studio, IIS7
  2. Linux中文件操作
  3. 使用Spring AOP和番石榴速率限制器的节气门方法
  4. leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)
  5. [教程]博客园插入视频教程
  6. 计算机网络中使用最广泛的交换技术是什么,04741计算机网络原理试题及答案201604...
  7. jq判断是否为整数_五种js判断是否为整数(转)
  8. [专栏精选]UnityWebRequest详解
  9. phpthink验证旧密码_忘记MacBook密码解决方法
  10. idea-解决安装及各种问题
  11. Map,List,Queue,Set和Stack的区别
  12. python读取fiddler_Python3.x+Fiddler抓取APP数据
  13. 单片机原理及应用程序c语言版题库,单片机原理及应用期末复习题库(含答案)...
  14. 车牌识别算法介绍与实践
  15. ANDROID 有关高德地图 导航SDK 组件不见的问题
  16. 导致锁表的原因及解决方法
  17. 悲观并发控制(Pessimistic Concurrency)
  18. 叉乘点乘混合运算公式_初中数学根式运算法则公式
  19. Java获取单个字符的方法
  20. CREO工程截面图如何一键去掉除截面后面多余的线

热门文章

  1. cp: /usr/bin/chromedriver: Operation not permitted
  2. 电脑如何格式化_分别手把手教你在Windows和mac上格式化磁盘
  3. python知识点:文件读写以及其他基础知识点
  4. Linux 关机命令介绍shutdown
  5. 单片机有啥用?现在用的还多吗?
  6. java 两份文档相似性_两个数据集之间的相似百分比
  7. 模板 - 上下界网络流
  8. 模板 - 有向图的连通性
  9. springboot+shiro使用权限注解问题_无法使用注解_使用注解无法跳转无权限页面
  10. 添加议题模块html,WordPress 技巧:为评论模块增加更多 HTML 标签支持