ACM 线段树那点事儿
文章平均质量分 70
HZXPH
这个作者很懒,什么都没留下…
展开
-
pku 2528 Mayor's posters-线段树+离散化
<br />第一道离散化是题目,不过这离散也太容易了,不用考虑冲突问题,不用记录<br />其它距离之类的数据,不过这道题有个囧地方(至少囧到我了),就是树的数组开3*N<br />不够,因为我以前都是开3*N,没出现过问题,这题把写完后WA了,真有点无语,<br />因为就觉得思路是没问题的,后来百度下,发现别人都开4*N的,后来想了想,上思修时<br />在纸上画了差不多一节课,发现根本原因:总的来说对于线段树最坏开到4*N就定没问题<br />因为它的结构是一个完全二叉树,当(N-1)是2的n次方是就原创 2011-05-10 15:56:00 · 555 阅读 · 0 评论 -
hdu 3584 三维树状数组 很烦的说
<br />/*三维树状数组*/ #include<stdio.h> #include<string.h> #define N 105 int tree[N][N][N]; int n; int lowbit(int x) { return x&(-x); } void tree_change(int x,int y,int z) { int flagy,flagz; while(x <= n){ flagy = y; while(flagy <= n){原创 2011-04-27 12:32:00 · 761 阅读 · 0 评论 -
hduu 1892 see you~~~二维树状数组
<br />WA了几次,都是一些小问题,不够细心,总是这样<br />这几天一直就在搞线段树和树状数组,也不知道怎么说好,对于树状数组更新区间问题<br />依依然云里雾里的说,我想是我还是没有理解好树状数组那两个函数的本质<br />在网上看到一个博文说其实它们本质是一样的,可以交换使用,不过自己还没有<br />测试过<br />#include<stdio.h> #include<string.h> #define EXCHANGE(a,b) (a) ^= (b);(b) ^= (a);(a) ^原创 2011-04-28 00:47:00 · 1446 阅读 · 0 评论 -
pku 3264 Balanced Lineup线段树
<br />第一次在pku做题,囧死了,这么一道题调了我N久<br />不过听说用RMQ-ST算法更高效,我用线段树做居然是4047ms<br />有点让我惊讶,居然可以慢成这样~~~~~~~~~<br /> <br />#include<stdio.h> #define N 50005 struct node{ int l; int r; int min; int max; }; node tree[3*N]; int arr[N]; void bu原创 2011-04-28 23:05:00 · 766 阅读 · 0 评论 -
hdu 1754 线段树
<br />节点保存区间的最大值,父结点保存左右结点中大的那个,建树时比较下就是了<br />#include<stdio.h> #define N 200005 struct node { int l; int r; int max; }; node tree[3*N]; int arr[N]; void buid_tree(int k,int left,int right) { int mid; int L,R; tree[k].l = le原创 2011-04-28 21:08:00 · 472 阅读 · 0 评论 -
pku 3468 线段树-又是成段修改
<br />虽然又是成段修改,但与 hdu 1698 有点不同<br />真的是越写越觉得线段树高深,灵活<br />说说这题,一开始感觉与hdu 1698 差不多(我的感觉向来单纯),很快就写了出来,结果<br />是果断的WA了,这里的传递的细节还是很值得注意的<br />WA了,然后想在结构体中增加一个flag域来记录这个区间是否全部的增加都相同,相同则向子<br />结点传递,在插入时并没有计算出区间的sum ,而是在查询时计算,不过这样让我WA了,TLE了<br />无数次,原因是,这样在查询是很原创 2011-05-04 12:53:00 · 1866 阅读 · 0 评论 -
hdu 1698 线段树(区间成段修改)
<br />一开始直接上,一个个地修改,然后果断超时了,百思不得其解唯有百度,goole<br />看了别人的博客,虽然现在代码写出来了,也明白了算法,但对于算法的分析太弱了<br />依然不是很明白为什么这样比直接上快这么多,突然让我意识到,算法分析非常重要<br />具有好的算法分析能力才更有可能设计出更好的算法,以后这方面得多多加强!!!<br />超时代码:<br />#include<stdio.h> #define N 100005 struct node{ int l;原创 2011-05-03 23:15:00 · 3545 阅读 · 0 评论 -
hdu 1540 Tunnel Warfare
<br />做线段也做了不少题了,想看看自己什么水平,就随便找一道题来做,<br />谁知,还是不行,最后还是去百度,goole了,看了别人的解题报告才知道自己是多么天真<br />自己的方法一点好似不靠边,哎~~~~<br /> <br />这题说是经典的说,特别是它的查询,觉得如果是自己从一片空白想出来还是真难的说,不过<br />看别人的代码还是很容易理解的,继续努力!!!!!<br />关键更新:<br /> tree[k].ml = max(max(tree[L].ml,tree[R].ml),t原创 2011-05-05 16:11:00 · 1363 阅读 · 0 评论 -
pku 2777 cout the color--线段树
<br />线段树约对是神马的东西,自己的想法又失败了,果断超时~~~~~~~~<br /> <br />#include<stdio.h> #include<string.h> #define N 100005 #define Exchange(a,b) (a)^=(b); (b)^=(a); (a)^=(b) struct node{ int l; int r; int col; }; node tree[3*N]; node *(p[N]); int c原创 2011-05-06 10:06:00 · 697 阅读 · 0 评论 -
hdu 1394 线段树版~~~@ !@
<br />#include<stdio.h> #define N 5005 struct node{ int l; int r; int sum; }; int arr[N]; node tree[3*N]; void buid_tree(int k,int left,int right) { int mid; int L,R; tree[k].l = left; tree[k].r = right; if(right-left == 1){原创 2011-04-26 00:00:00 · 622 阅读 · 0 评论 -
hdu 1541 树状数组版)——咯咯
<br />/*树状数组版*/ #include<stdio.h> #include<string.h> #define L 32005 #define N 15005 int tree[L]; int count[N]; int n; int lowbit(int x) { return x & (x ^ (x-1)); } int get_sum(int k) { int sum = 0; while(k >=1){ sum += tree原创 2011-04-23 02:02:00 · 508 阅读 · 0 评论 -
pku 1151 Atlantis(线段树+离散化+扫描线)
<br />先不说,因为还不是很懂的说~~~~~~<br />#include<iostream> #include<cstdlib> #define N 105 using namespace std; struct elem{ double x; double s; double t; bool flag; }; struct node{ int l; int r; int cover; double m; }; elem cor[2*N]原创 2011-05-12 11:36:00 · 600 阅读 · 0 评论 -
hdu 1151 覆盖的面积(离散化+类似面积并)
<br />虽然是过,其实我也没想会过,这样做竟不超时,有点厉害<br />不过也有点慢了,回来再做过<br />我用了lazy思想,由于每次都要tree_search使得其很慢,网上有些代码是<br />增加记录域ylenonce,ylenmore分别是记录覆盖一次的长度,覆盖二次以上的长度<br />这样就不要tree_searh了,快了不知多少~~~<br /> <br />我的代码:<br />#include<iostream> #include<cmath> #include<cstdlib原创 2011-05-15 10:17:00 · 844 阅读 · 0 评论 -
pku 1177 pictures (线段树+扫描线+离散化)
<br />只能说与pku1151相似,别的还没有发言权<br />哎~~~~~~~~~~愿自己一路走好!!!!!<br /> <br />代码:<br /> <br />#include<iostream> #include<cstdlib> #include<cmath> #define N 5005 using namespace std; struct elem{ double x; double ly; double ry; bool flag; }; s原创 2011-05-13 15:37:00 · 686 阅读 · 0 评论 -
hdu 1166 很蛋疼~~~~
<br />/*1166 敌兵布阵*/ #include<stdio.h> #include<string.h> #define N 50005 struct node{ int l; int r; int sum; }; node tree[3*N];//数大了,要开全局变量,不过有点矛盾,因为看了老师给的一本书说尽量不要用全局变量 int num[N]; //三个子函数都用到几乎一样的思想 void buid_tree(node *pt,int *pn,in原创 2011-04-21 20:40:00 · 509 阅读 · 0 评论 -
hdu 2492 ping pongs 好似有点感觉了~~
<br />这次还是想了很久,在床上时突然间想通了,不过写得不是太慢了,写代码总是出现一些低级失误,这雨真有点无语~~~~~<br /> <br />#include<stdio.h> #define N 100024 struct node{ int l; int r; int sum; }; node tree1[3*N]; node tree2[3*N]; int count[N]; int count1[N]; int arr[N]; void buid_tr原创 2011-04-25 02:04:00 · 630 阅读 · 0 评论 -
hdu 2492 ping pongs-树状数组版,加油@@!!
<br />真的越来越发觉树状数组比起线段树来说,无论是时间复习度还是空间复习度都明显强大得多,并且代码实现也简单得多!!!!<br /> <br />#include<stdio.h> #include<string.h> #define N 100024 int tree1[N]; int tree2[N]; int count[N]; int count1[N]; int arr[N]; int lowbit(int x) { return x&(x^(x-1)); }原创 2011-04-25 03:04:00 · 698 阅读 · 0 评论 -
hdu 1166 _ 树状数组版
<br />#include<stdio.h> #include<string.h> int arr[50005]; int c[50005]; int n; int lowbit(int x) { x = x & (x ^ (x-1)); return x; } void change(int x,int y) { while(x <= n) { c[x] += y; x += lowbit(x); } } int get_sum(in原创 2011-04-23 00:32:00 · 435 阅读 · 0 评论 -
hdu 1541 stars~~线段树版~~嘻嘻
#include #include #define L 32000 #define N 15000 struct node{ int l; int r; int sum; }; node tree[3*L]; int count[N] = {0}; int n; void buid_tree(int k,int left,int right) { int mid; tree[k].l = left; tree[k].r = right; if(原创 2011-04-23 00:04:00 · 606 阅读 · 0 评论 -
hdu 1566 Color the ball---线段树
<br />不知值不值得开心,这题我是没有百度,google的说,自己的方法过的感觉就是不一样<br />前天做了pku的346觉得思路用在这题也行,结果还真的,嘻嘻~~<br />#include<stdio.h> #define N 100005 struct node{ int l; int r; int sum; int add; node *after; }; node tree[3*N]; node *(p1[N]);//指针数组,指向,原创 2011-05-05 22:09:00 · 834 阅读 · 0 评论