线段树:

http://www.notonlysuccess.com/index.php/segment-tree-complete/
鉴于notonlysuccess大牛的博客对于题目的思路写的很简陋,我就稍微补充下。
线段树的基本内容,是通过建二叉树来实现段的存储,最下面的叶子节点是每个值,左孩子和右孩子的父亲则是这个段的信息,依次推上去,实现从1..n的存储。可以通过程序带入样例来模拟这个过程体会。
建树:非叶子节点存储的都是段的值,而每个段,都有一个左边界和右边界。那么就建到叶子节点为止。每次都二分这个段,最后肯定会左边界等于右边界。
更新:如果是点更新则判断点即可,只是在判断该点在哪个区间的时候注意,一下。
查询:查询和更新类似
注意每一个return。
敌兵布阵:很简单的查询和单点更新

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. ;
  6. int n;
  7. struct node{
  8. int data,left,right;
  9. void init(int aleft,int aright){
  10. left=aleft;
  11. right=aright;
  12. data=;
  13. }
  14. }tree[MAXN<<];
  15. void pushup(int id){
  16. tree[id].data=tree[id<<].data+tree[id<<|].data;
  17. }
  18. void build(int left,int right,int id){
  19. tree[id].init(left,right);
  20. if(left==right){
  21. scanf("%d",&tree[id].data);
  22. return;//remember here!
  23. }
  24. ;
  25. build(left,mid,id<<);
  26. build(mid+,right,id<<|);
  27. pushup(id);
  28. }
  29. int query(int left,int right,int id){
  30. if(left==tree[id].left&&right==tree[id].right)return tree[id].data;
  31. ;
  32. );
  33. else
  34. |);
  35. else
  36. )+query(mid+,right,id<<|);
  37. }
  38. void update(int p,int vadd,int id){
  39. if(tree[id].left==tree[id].right){
  40. tree[id].data+=vadd;
  41. return ;
  42. }
  43. ;
  44. );
  45. |);
  46. pushup(id);
  47. }
  48. int main(){
  49. int t,a,b;
  50. scanf("%d",&t);
  51. ];
  52. ;i<=t;i++){
  53. printf("Case %d:\n",i);
  54. scanf("%d",&n);
  55. build(,n,);
  56. ]!='E'){
  57. scanf("%d%d",&a,&b);
  58. ]){
  59. ));break;
  60. );break;
  61. );break;
  62. }
  63. }
  64. }
  65. ;
  66. }

hdu1754 I Hate It :单点替换,注意pushup上去

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. ;
  6. struct node{
  7. int data,left,right;
  8. void init(int aleft,int aright){
  9. left=aleft;right=aright;
  10. data=;
  11. }
  12. };
  13. node tree[MAXN<<];
  14. inline void pushup(int id){
  15. tree[id].data=max(tree[id<<].data,tree[id<<|].data);
  16. }
  17. void build(int left,int right,int id){
  18. tree[id].init(left,right);//this
  19. if(left==right){
  20. scanf("%d",&tree[id].data);
  21. return;
  22. }
  23. ;
  24. build(left,mid,id<<);
  25. build(mid+,right,id<<|);
  26. pushup(id);
  27. }
  28. void update(int p,int value,int id){
  29. if(tree[id].left==tree[id].right){
  30. tree[id].data=value;
  31. return;
  32. }
  33. ;
  34. );
  35. |);
  36. pushup(id);
  37.  
  38. }
  39. int query(int left,int right,int id){
  40. if(left==tree[id].left&&right==tree[id].right)return tree[id].data;
  41. ;
  42. );
  43. else
  44. |);
  45. else
  46. ),query(mid+,right,id<<|));
  47.  
  48. }
  49. int main(){
  50. int n,m,a,b;
  51. ];
  52. while(scanf("%d%d",&n,&m)!=EOF){
  53. build(,n,);
  54. ;i<m;i++){
  55. scanf("%s%d%d",&op,&a,&b);
  56. ]==));
  57. );
  58. }
  59. }
  60.  
  61. ;
  62. }

hdu1394 Minimum Inversion Number 题意:求Inversion后的最小逆序数可以看看这篇博客

http://www.cnblogs.com/ziyi--caolu/archive/2013/01/15/2860768.html

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. ;
  6. struct node{
  7. int left,right,data;
  8. void init(int aleft,int aright){
  9. left=aleft;
  10. right=aright;
  11. data=;//the num of the value before it
  12. }
  13. };
  14. node tree[MAXN<<];
  15. int n,a[MAXN];
  16. inline void pushup(int id){
  17. tree[id].data=tree[id<<].data+tree[id<<|].data;
  18. }
  19. void build(int left,int right,int id){
  20. tree[id].init(left,right);
  21. if(left==right)return;
  22. ;
  23. build(left,mid,id<<);
  24. build(mid+,right,id<<|);
  25. }
  26. void update(int p,int id){
  27. if(tree[id].left==tree[id].right){
  28. tree[id].data=;
  29. return;
  30. }
  31. ;
  32. );
  33. |);
  34. pushup(id);
  35. }
  36.  
  37. int query(int k,int id){
  38. ;
  39. if(k<=tree[id].left)return tree[id].data;
  40. ;
  41. )+query(k,id<<|);
  42. }
  43. int main(){
  44. while(scanf("%d",&n)!=EOF){
  45. build(,n-,);
  46. ;
  47. ;i<n;i++){
  48. scanf("%d",&a[i]);
  49. ans+=query(a[i],);
  50. update(a[i],);
  51. }
  52. int minx=ans;
  53. ;i<n;i++){
  54. ans+=n-*a[i]-;
  55. if(ans<minx)minx=ans;
  56. }
  57. printf("%d\n",minx);
  58. }
  59. ;
  60. }

AC题目简解-线段树的更多相关文章

  1. AC题目简解-数据结构

    A - Japan  POJ 3067 要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...

  2. AC题目简解-dp

    dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成 ...

  3. AC题目简解-数论

    反素数: HDU2521定义对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x ...

  4. [zoj3813]Alternating Sum 公式化简,线段树

    题意:给一个长度不超过100000的原串S(只包含数字0-9),令T为将S重复若干次首尾连接后得到的新串,有两种操作:(1)修改原串S某个位置的值(2)给定L,R,询问T中L<=i<=j& ...

  5. 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)

    原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解    By 岩之痕 目录: 一:综述 ...

  6. hdu4973 线段树(题目不错,用了点,段,更新查找还有DFS)

    题意:       给你一个初始序列,初始序列长度n,分别为1 2 3 4 5 ....n,有两种操作 (1)D l r 把l_r之间的数据都复制一遍 1 2 3 4 5 6 D 2 4 = 1 2 ...

  7. [Swust OJ 746]--点在线上(线段树解法及巧解)

    题目链接:http://acm.swust.edu.cn/problem/746/ Time limit(ms): 1000 Memory limit(kb): 65535   fate是一个数学大牛 ...

  8. 题解报告:hdu 1754 I Hate It(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某 ...

  9. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

随机推荐

  1. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)

    AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...

  2. C#实现斐波那契数列求和

    一个比较典型的递归调用问题,总结一下.网上看了一个链接,比较好:http://blog.csdn.net/csd_xiaojin/article/details/7945589 贴个图先,回头再整理: ...

  3. MySQL 多实例给root用户创建密码

    DB:5.5.14 OS:CentOS 6.3 安装多实例MySQL数据库,安装完成后默认无密码,一次性给所有实例的root账户创建密码: #!/bin/bash for i  in {3361..3 ...

  4. Seafile V4.1 安装笔记

    yum -y install gcc gcc-c++ make cmake pcre pcre-devel expat expat-devel curl wget mlocate gd gd-deve ...

  5. 从零开始学ios开发(十八):Storyboards(下)

    这篇我们完成Storyboards的最后一个例子,之前的例子中没有view之间的切换,这篇加上这个功能,使Storyboards的功能完整呈现.在Storyboards中负责view切换的东西叫做“s ...

  6. SlimDx绘制点图元的问题

    问题:点图元在自己创建的三维环境里渲染不出来,代码如下: GMCustomVertex.PositionNormalColored wellPart = new GMCustomVertex.Posi ...

  7. Error: Most middleware (like bodyParser) ...

    运行NodeJS时出现如下错误: Error: Most middleware (like bodyParser) is no longer bundled with Express and must ...

  8. Python环境搭建和开发工具的配置

    本文转自http://237451446.blog.51cto.com/2307663/766781 因为要学习python了,第一步当然是环境搭建和开发工具的配置了,下边开始了. 我的开发环境是在w ...

  9. 【转】android如何浏览并选择图片 音频 视频

    转自:http://www.cnblogs.com/top5/archive/2012/03/06/2381986.html   这几天 在学习并开发android系统的图片浏览 音频 视频 的浏览 ...

  10. android 开发不能创建目录

    原来代码: File tempDir = new File(path); //path 是一个参数 if (!tempDir.exists()) { try { tempDir.mkdir(); // ...