线段树
煦--晨
菜鸟起飞
展开
-
Data Structure?(hdu4217)
线段树模板题线段树的题目。向上更新。题意:有N个数[ 1,2,3,,,,,n ],取K个数,每次去第i小的数。思路:建立一个线段树,树节点记录的是节点所表示的区间内剩余数的个数(初始化时叶子节点的值都为1,然后向上传递)。取数时,先找到第i小的数的叶子,值修改为1,然后向上传递。 #include"stdio.h"#include"string.h"#includ原创 2013-07-31 12:28:05 · 560 阅读 · 0 评论 -
poj(3264)(最大值与最小值之差)
#include#include#includeint b[600000];int mi,ma;struct point { int x,y; int max; int min;}a[600000];int max(int a,int b){ a=a>b?a:b; return a;}int min(int a,int b){原创 2013-07-31 18:49:32 · 642 阅读 · 0 评论 -
hdu(1698)Just a Hook
题意:给出一个数列,初始值都是1,进行一种操作:给出一个区间,将该区间内的数值全部换为2或3或不变,求数列最后的总和。#include#includestruct point { int x,y; int sum;}a[600000];void tree(int t,int x,int y){ a[t].x=x; a[t].y=y原创 2013-08-01 22:50:32 · 513 阅读 · 0 评论 -
poj(3468)A Simple Problem with Integers
POJ 3468其实算是一道比较基础的线段树的题了,但若用普通的毫不优化的线段树去做的话,绝对是会TLE的。这道题优化的思路就是,每次插入一个数字时,没必要把数字一直插入到叶子节点,只要有适合的范围就插入到这个范围中,用一个增量记录它,当下一次若有询问时,这个范围若刚好适合询问的范围,就直接把原来这个节点的值加上增量乘以范围,再加到SUM中,就可以了,若这个节点的范围不适合查原创 2013-08-01 22:42:20 · 557 阅读 · 0 评论 -
hdu(1394)Minimum Inversion Number
感觉此题还是用暴力比较方面,不过用线段树更快。。 //先用线段树求出初始的时候,逆序数的个数,再利用公式求最小的。。//这个下标必须从零开始,不然会无法运行。 左移序列之后得到新的序列的逆序数的个数就等与当前总的个数减左边的数的逆序数a[i],然后加上新增的逆序数n-a[i]-1即sum=sum-a[i]+n-a[i]-1;#include"stdio.h原创 2013-08-08 16:52:09 · 605 阅读 · 0 评论 -
hdu(3308)LCIS
给定N个数,两种操作U A B:把第A个数变为B(从0开始计数)Q A B :查询A到B内,最长的连续上升序列长度向上更新部分要注意细节对于左连续的话,可以由左孩子的左连续得来,但是可能包括右孩子的左连续,要进行判断左孩子的左连续是否是整个区间,而且中间的结合是否满足递增右连续一样。对于整个区间的最值,可能来源与左右孩子的最值,也可以来源于两个区间的中间部分。原创 2013-08-08 10:29:55 · 691 阅读 · 0 评论 -
hdu(1556)Color the ball
第一次用直接更新到节点的方法,结果果断超时。。唉。。只有用更新区间的方法了;只要图的颜色在这个区间就可以加一,这样使得增加的值都存在了区间最大的节点上,为了使其下达给下面各个节点,就用到了sum函数。不过这样感觉还是慢啊,一千多毫秒。。#include"stdio.h"#include"string.h"struct point{ int x,y,sum,s;}原创 2013-08-08 15:21:25 · 582 阅读 · 0 评论 -
hdu(2795)
#include"stdio.h"#include"string.h"struct point { int x,y; int sum;}a[200000*3];int h,w,n;int max(int a,int b){ a=a>b?a:b; return a;}void tree(int t,int x,int y)原创 2013-08-05 23:39:54 · 556 阅读 · 0 评论 -
I Hate It(hdu1754)
不多说和上题差不多,同样的模板。。好好想想。。#include#include#include#define N 200000int max(int a,int b){a=a>b?a:b;return a;}struct point {int x,y;int max,sum;}a[N*3];void tree(int t,int x,in原创 2013-07-29 19:36:32 · 462 阅读 · 0 评论 -
hdu(1166))敌兵布阵
第一道:线段数题,虽然用时很长,但很值得。。 #include#include#define N 55000struct point{ int x,y;//x,y分别表示区间的左右边界 int sum;//表示当前区间的和}a[N*3];void tree(int t,int x,int y)//建树{ a[t].x=x原创 2013-07-29 16:11:29 · 501 阅读 · 0 评论 -
总结
线段树的查找: 一个线段树的结点表示一个区间,同时结点中保存所需要的信息。 如果询问区间正好为这个线段树的区间(左边界和右边界都相同),则返回该结点中保存的信息。 否则,递归往下查询该结点的子结点(之后再返回的值就是子结点的值了,与当前结点无关了) 一直到“元线段”-不可再分之线段。 线段树的结点原创 2013-07-31 12:50:26 · 555 阅读 · 0 评论 -
hdu3074(Multiply game)
纯模板,就是把单点更新,区间求和改为单点更新,区间求积。题意:给出n个数,有m个操作,操作有:询问区间[L,R]中所有数的成绩、改变某一个数的值。思路:线段树模版题。在每个结点设一个值保存乘积。 #include#include#include#define N 60000#define M 1000000007struct point { int原创 2013-08-01 00:53:04 · 530 阅读 · 0 评论