今天学了线段树0.0。什么是线段树呢。。这个我建议去看一下这个博客:http://www.cnblogs.com/TenosDoIt/p/3453089.html
线段树是一种树形数据结构,用的是分治的思想(也许!?)。可以实现线段中的求和,求点的最小值等操作。并且修改点非常方便。分为以下几个操作。
建树,查询,修改(点或区间)。下面只给了修改一个点的代码,修改区间的0.0嗯。。明天再发吧。。另外写个日记吧。。距离NOIP复赛还有不到一个月。。~哎0.0.感觉自己需要学的还有很多很多,上周做了模拟赛。哎0.0D1T1想错然后暴力少打30分。T2答案输出顺序打反暴零。。T3神奇的骗到了50分?惊了。。D2T1几乎离正解就差一步,然后不相信自己选择了暴力骗30分。。T2直接写暴力,T3完全不会做。。感觉还是做题少,然后去刷了刷普及组水题。到时候有时间把代码整理一下全发过来。。
不知道沿着这条路走,收获的是成功的喜悦还是失败后的泪水。好在班主任还是挺支持我们的,不过感觉平时除了OI生活就没有什么期盼了呢0.0咳嗯还有ly。既然选择了远方,便只顾风雨兼程嘛。。小luoyue应该相信自己才对。。算了不写了0.0..
struct xds{
#define lson (o<<1)
#define rson (o<<1|1)
int sumv[MAXN<<2]; //储存线段和
inline void pushup(int o){sumv[o]=sumv[lson]+sumv[rson];} //可以查最小值,求和等操作
inline void build(int o,int l,int r){
if(l==r){sumv[o]=a[l];return;} //a为维护数组 o树中位置 ,l==r递归到最后一层;
int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r); //建左右子树
pushup(o);
}
inline int csum(int o,int l,int r,int ql,int qr){ //o l r当前节点编号区间 ql qr询问区间
if(ql<=l&&r<=qr)return sumv[o]; //包含直接计入答案
int mid=(l+r)>>1;
int ans=0;
if(ql<=mid) ans+=csum(lson,l,mid,ql,qr); //去查找左右子树
if(mid<qr) ans+=csum(rson,mid+1,r,ql,qr);
return ans;
}
inline void change(int o,int l,int r,int q,int v){//单点修改操作
if(l==r){
sumv[o]+=v;
return;
}
int mid=(l+r)>>1;
if(q<=mid)change(lson,l,mid,q,v);
else change(rson,mid+1,r,q,v);
pushup(o);
}
};