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 [题目类型]线段树 ...
随机推荐
- 关于华为C8812救砖教程
问题:华为C8812刷机后,开机显示:---------------------------------------------------------------- Image signature ...
- openerp经典收藏 对象的预定义方法(转载)
对象的预定义方法 原文:http://shine-it.net/index.php/topic,2159.15.html 每个OpenERP的对象都有一些预定义方法,这些方法定义在基类osv.osv中 ...
- MySQL 库大小、表大小、索引大小查询命令
1.进去指定schema 数据库(存放了其他的数据库的信息) mysql> use information_schema; 2.查询所有数据的大小 mysql> sele ...
- 【个人笔记】001-PHP基础-01-PHP快速入门-01-PHP职业路线及PHP前景
001-PHP基础-01-PHP快速入门 01-PHP职业路线及PHP前景 PHP职业路线 PHP初级工程师 1年以下 3k-6k PHP中级工程师 1-3年6k-10k PHP高级工程师 3年以上 ...
- C语言标准库函数strcpy与strcmp的简单实现
//C语言标准库函数strcpy的一种简单实现. //返回值:目标串的地址. //对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL. //参数:des为目标字符串, ...
- Android bluetooth low energy (ble) writeCharacteristic delay callback
I am implementing a application on Android using BLE Api (SDK 18), and I have a issue that the trans ...
- C#调用PowerShell的经历
好久没有写程序了, 再次上手也处于功能强大的Windows PowerShell的缘故. 不多话, 先上段代码引入正题.... static Collection<PSObject> Ru ...
- NopCommerce——Web层中的布局页
援引上一篇文章关于nopcommerce源代码结构的翻译:“Nop.Web也是一个MVC Web应用程序项目,一个公有区域的展示层.它就是你实际能够运行的应用程序.它是应用程序的启动项目”.对于nop ...
- 一个完整openlayer的例子,包括marker,popup等
整理转自:http://www.blogjava.net/siriusfx/archive/2007/11/26/163104.html openlayers提供了几十个示例,虽然每个示例都很简单,但 ...
- Thinkphp中路由Url获取的使用方法
Thinkphp是一个体系较为完整的框架,很多地方比国外的框架功能都全,唯一不喜之处是性能,和传说中的.NET有点像. Thinkphp提供较全url处理体系,通过同一规则实现Url的路由和Url生成 ...