线段树:

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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
;
int n;
struct node{
    int data,left,right;
    void init(int aleft,int aright){
        left=aleft;
        right=aright;
        data=;
    }
}tree[MAXN<<];
void pushup(int id){
    tree[id].data=tree[id<<].data+tree[id<<|].data;
}
void build(int left,int right,int id){
    tree[id].init(left,right);
    if(left==right){
        scanf("%d",&tree[id].data);
        return;//remember here!
    }
    ;
    build(left,mid,id<<);
    build(mid+,right,id<<|);
    pushup(id);
}
int query(int left,int right,int id){
    if(left==tree[id].left&&right==tree[id].right)return tree[id].data;
    ;
    );
    else
        |);
        else
            )+query(mid+,right,id<<|);
}
void update(int p,int vadd,int id){
    if(tree[id].left==tree[id].right){
        tree[id].data+=vadd;
        return ;
    }
    ;
    );
    |);
    pushup(id);
}
int main(){
    int t,a,b;
    scanf("%d",&t);
    ];
    ;i<=t;i++){
        printf("Case %d:\n",i);
        scanf("%d",&n);
        build(,n,);
        ]!='E'){
            scanf("%d%d",&a,&b);
            ]){
            ));break;
            );break;
            );break;
            }
        }
    }
    ;
}

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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
;
struct node{
    int data,left,right;
    void init(int aleft,int aright){
        left=aleft;right=aright;
        data=;
    }
};
node tree[MAXN<<];
inline void pushup(int id){
    tree[id].data=max(tree[id<<].data,tree[id<<|].data);
}
void build(int left,int right,int id){
    tree[id].init(left,right);//this
    if(left==right){
        scanf("%d",&tree[id].data);
        return;
    }
    ;
    build(left,mid,id<<);
    build(mid+,right,id<<|);
    pushup(id);
}
void update(int p,int value,int id){
    if(tree[id].left==tree[id].right){
        tree[id].data=value;
        return;
    }
    ;
    );
    |);
    pushup(id);

}
int query(int left,int right,int id){
    if(left==tree[id].left&&right==tree[id].right)return tree[id].data;
    ;
    );
    else
        |);
        else
            ),query(mid+,right,id<<|));

}
int main(){
    int n,m,a,b;
    ];
    while(scanf("%d%d",&n,&m)!=EOF){
        build(,n,);
        ;i<m;i++){
            scanf("%s%d%d",&op,&a,&b);
            ]==));
            );
        }
    }

    ;
}

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

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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
;
struct node{
    int left,right,data;
    void init(int aleft,int aright){
        left=aleft;
        right=aright;
        data=;//the num of the value before it
    }
};
node tree[MAXN<<];
int n,a[MAXN];
inline void pushup(int id){
    tree[id].data=tree[id<<].data+tree[id<<|].data;
}
void build(int left,int right,int id){
    tree[id].init(left,right);
    if(left==right)return;
    ;
    build(left,mid,id<<);
    build(mid+,right,id<<|);
}
void update(int p,int id){
    if(tree[id].left==tree[id].right){
        tree[id].data=;
        return;
    }
    ;
    );
    |);
    pushup(id);
}

int query(int k,int id){
    ;
    if(k<=tree[id].left)return tree[id].data;
    ;
    )+query(k,id<<|);
}
int main(){
    while(scanf("%d",&n)!=EOF){
        build(,n-,);
        ;
        ;i<n;i++){
            scanf("%d",&a[i]);
            ans+=query(a[i],);
            update(a[i],);
        }
        int minx=ans;
        ;i<n;i++){
            ans+=n-*a[i]-;
            if(ans<minx)minx=ans;
        }
        printf("%d\n",minx);
    }
    ;
}

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. 全民wifi钓鱼来临----agnes安卓wifi钓鱼神器介绍

    断断续续搞了一些无线的东西,从bt5的aircrack-ng的破无线(没怎么成功过)其实EWSA这个用GPU跑还算不错,可惜了我这显卡也只能每秒2500,到用c118在OsmocomBB基础上进行gs ...

  2. WPF自定义控件(三)——Window

    一样!先来看看效果吧: 怎么样?效果很好吧,而且不只是样式哟!所有系统窗体有的交互操作都可以实现! 但可惜...有很多和系统API有关的东西本人了解得并不多,所以这个窗体是基于他人的成果上产生的.关于 ...

  3. IOS 基于APNS消息推送原理与实现(JAVA后台)

    Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...

  4. 为aps.net core项目加上全局异常捕捉和记录

    在asp.net core中的方案在这里:http://stackoverflow.com/questions/30385246/can-asp-net-5-app-useerrorhandler-a ...

  5. iOS常见问题(2)

    一.模拟器黑屏 解决方法: 二.打代码时,Xcode没提示 解决方法: 0. 点击Preferences 1. 进入Text Editing 2. 勾选 三.有时候可能在勾选 Autolayout的时 ...

  6. Spiral Matrix II

    Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...

  7. ASP.NET Web - 回送

    如果希望把更改事件立即传送给服务器,可以把AutoPostback属性设置为true.这样就会使用客户端的JavaScript把窗体数据立即提交给服务器.当然,网络通信量也会增加.使用这个功能时要小心 ...

  8. windows 2008 怎么对外开放端口

    服务器已经运行了程序,但是android客户端连接不上, 网上提示说用: start /min telnet 192.168.3.42 2121 查看,但是我的提示tenlet找不到命令,估计是端口的 ...

  9. Android使用XML做动画UI

    在Android应用程序,使用动画效果,能带给用户更好的感觉.做动画可以通过XML或Android代码.本教程中,介绍使用XML来做动画.在这里,介绍基本的动画,如淡入,淡出,旋转等. 效果: htt ...

  10. Pentaho Data Integration笔记 (一):安装

    介绍 Pentaho Data Integration (PDI) is an extract, transform, and load (ETL) solution that uses an inn ...