AC题目简解-线段树
线段树:
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题目简解-线段树的更多相关文章
- AC题目简解-数据结构
A - Japan POJ 3067 要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...
- AC题目简解-dp
dp类:A - Bridging signals ZOJ 3627 POJ1631 HDU1950给出一个从1-n的数字排列,求最长上升子序列长度.直接说解法吧.新开一个数组d,d[i]表示的是能构成 ...
- AC题目简解-数论
反素数: HDU2521定义对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x ...
- [zoj3813]Alternating Sum 公式化简,线段树
题意:给一个长度不超过100000的原串S(只包含数字0-9),令T为将S重复若干次首尾连接后得到的新串,有两种操作:(1)修改原串S某个位置的值(2)给定L,R,询问T中L<=i<=j& ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 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 ...
- [Swust OJ 746]--点在线上(线段树解法及巧解)
题目链接:http://acm.swust.edu.cn/problem/746/ Time limit(ms): 1000 Memory limit(kb): 65535 fate是一个数学大牛 ...
- 题解报告:hdu 1754 I Hate It(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某 ...
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
随机推荐
- CSS各个浏览器Hack的写法
Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack.然后将Hack ...
- 使用virtualenv或zc.buildout创建Python-tornado分离环境
originally created by shuliang under CC BY-NC-ND 3.0 license 一.引言 学习编程,好比练功,总得先有个环境,搭台子是必须的.为了照顾初学者, ...
- 菜鸟学习Struts——简易计算器
这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...
- HotSpot Builder Utility安装指南
系统需求硬件- 一台带有1个以太网卡的电脑(宿主机)- 一个无线路由器 软件- VirtualBox 4.1或更高的版本.下载网址:http://www.virtualbox.org/- 我们提供的最 ...
- 【img】 图片是怎么存储的
用ue 打开一张图片,动动手脚,出现卡碟的画面效果. 可不可以用C#来做一个图片编辑器? 怎么做?路线怎么走? 稍后揭晓答案 根据实际操作获取类一些基础知识: 1. 文件是二进制存储的,为了便于查看编 ...
- UML 小结(2)- 理论理解
什么是UML: UML是统一建模语言(UML是 Unified Modeling Language的缩写)是用来对软件密集系统进行可视化建模的一种语言. UML为面向对象开发系统的产品进行说明.可视化 ...
- jquery ajax对特殊字符进行转义防止js注入使用示例
在使用ajax进行留言的时候,出现了一个问题.因为留言内容写完之后,通过ajax提交内容,同时使用js把留言的内容添加到页面上来.浏览留言的时候也是通过ajax请求,然后再显示的.这样,如果有人在留言 ...
- HDU 2821 Pusher
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 首先,题目描述给的链接游戏很好玩,建议先玩几关,后面越玩越难,我索性把这道题A了,也就相当于通关 ...
- 【BZOJ】【2208】【JSOI2010】连通数
题解: 1.Tarjan缩点以后对每个连通分量进行深搜,看能到哪些连通分量,能到达的所有连通分量的size之和记为sum.则第i个连通分量对答案的贡献为size[i]*sum(到其他连通分量)+siz ...
- Oracle 10G 安装后 不能卸载, 不能打开Web管理....
1. 不能卸载. 点击这个卸载. 提示: 解决方法: 右键卸载, 设置兼容性为XP. 就可以使用了. 2. oracle10g登录em后,提示"java.lang.Except ...