2013年2月7日

HDU 4027--线段树

摘要: 线段树,这里看起来有点像是成段更新,但是又不太像,不需要用到标记。。题意:给你N个数,有M个操作,操作有两类,(1)"0 l r",表示将区间[l,r]里的每个数都开根号。(2)"1 l r",表示查询区间[l,r]里所有数的和。这个题有两个注意的地方,一个是在更新sum的时候有个技巧,如果这个和等于区间的子树个数,即sum[rt]==r-l+1,这个时候就不用更新了。。因为sqrt(1)==1;否则会超时。然后还有一个比较坑爹的地方,这里的a可能比b大。。。View Code 1 #include<iostream> 2 #include& 阅读全文

posted @ 2013-02-07 21:52 acoderworld 阅读(94) 评论(0) 推荐(0)

HDU 1698---线段树

摘要: 线段树成段更新模板题。。题意:给你T组数据,N个数(初始时每个数的值为1),M个操作,每个操作把区间[a,b]里的数更新为c,问最后这N个数的和是多少。代码: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define maxn 100100 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 int sum[maxn<<2],flag[maxn<<2]; 8 void Push 阅读全文

posted @ 2013-02-07 21:47 acoderworld 阅读(92) 评论(0) 推荐(0)

POJ 2528--线段树离散化

摘要: 这是hh的解释:题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了所以离散化要保存所有需要用到的值,排序后,分别映射到1~n,这样复杂度就会小很多很多而这题的难点在于每个数字其实表示的是一个单位长度(并 阅读全文

posted @ 2013-02-07 21:45 acoderworld 阅读(161) 评论(0) 推荐(0)

Poj 3468--线段树

摘要: http://poj.org/problem?id=3468线段树成段更新模版题。。但是这里这个惰性标记有点神奇,,看了好久才理解。。这里简单的讲下懒惰标记,懒惰标记即是要修改一个区间的时候,暂时不需要修改区间中的每个点,加一个标志代表这个区间被修改了,等到需要查询一个小区间的时候再具体修改。至于为什么要这样呢,不妨这么考虑,当更新一段区间的时候,如果没有懒惰标记,一开始如果找到的区间比要更新的区间大,那么这个大的区间里的每个点都需要修改,这样时间复杂度就是o(n)了,这跟没用线段树一样,至于单点更新为什么不需要这个呢,是因为单点更新都是更新一个点,所以不会出现更新区间这样的问题,而采用了懒惰 阅读全文

posted @ 2013-02-07 21:41 acoderworld 阅读(124) 评论(0) 推荐(0)

导航