关于线段数自我总结

线段树

FIRST:

线段树是干嘛用的
给定n个数,支持操作:
①单点修改,单点查询。
②区间修改,单点查询。
③单点修改,区间查询。
④区间修改,区间查询。
时间复杂度要求小于n^2。


动态开点

void update (int &root,int l,int r,int t,int x) //当前节点编号,当前节点对应的区间,要修改的叶子结点编号,增加的值 { if (!root) root=++cnt; 
  sum[root]+=x; if (l==r) return; int mid=(l+r)/2; if (t<=mid) update(L[root],l,mid,t,x); else update(R[root],mid+1,r,t,x);
} //Ex1

//update(root,1,9,5,3) //这棵线段树的叶子结点总共有9个,把第5个叶子增3 update(root,1,9,4,4)

1.如何查询?

int query (int &root,int l,int r,int x,int y) //当前节点在root,root对应的区间是[l,r],要查[x,y]的和 { if (l==x && r==y) return sum[root]; int mid=(l+r)/2,suml=0,sumr=0; if (x<=mid) suml=query(L[root],l,mid,x,min(mid,y)); //要查的区间的左端点被左儿子区间包含的时候  if (y>mid) sumr=query(R[root],mid+1,r,max(mid+1,x),y); return suml+sumr;
} 
//cout<<query(root,1,9,3,5) //查询[3,5]的和

问题2

区间修改,单点查询如何进行区间操作?
答:lazy tag!

void update (int &root,int l,int r,int p,int q,int x) //当前节点编号,当前节点对应的区间,要修改的区间编号,增加的值  { if (!root) root=++cnt; 
     sum[root]+=x*(l~r 和 p~q的交); if (l==p && r==q) {tag[root]+=x; return;} int mid=(l+r)/2; if (p<=mid) update(L[root],l,mid,p,min(q,mid),x); if (q>mid) update(R[root],mid+1,r,max(mid+1,p),q,x);
}
//update(root,1,9,5,7,3) //这棵线段树的叶子结点总共有9个,把编号为5~7个叶子增3

如何查询?

int query (int &root,int l,int r,int x,int y) // 当前节点在root,root对应的区间是[l,r],要查[x,y]的和  { if (l==x && r==y) return sum[root];
    Down(root,l,r); int mid=(l+r)/2,suml=0,sumr=0; if (x<=mid) suml=query(L[root],l,mid,x,min(mid,y)); //要查的区间的左端点被左儿子区间包含的时候   if (y>mid) sumr=query(R[root],mid+1,r,max(mid+1,x),y); return suml+sumr;
}
    // cout<<query(root,1,9,3,5); //查询[3,5]的和  int Down(int x,int l,int r) //为x的节点,x的区间是[l,r],进行标记下传  { if (!L[x]) L[x]=++cnt; if (!R[x]) R[x]=++cnt;
    tag[L[x]] += tag[x];  tag[R[x]] += tag[x];
    sum[L[x]] += tag[x] * (左儿子节点个数);
    sum[R[x]] += tag[x] * (..);
    tag[x]=0;
}

全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
11-13 11:25
吉林大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务