2013年2月19日

hdu 1258--DFS

摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1258题目描述:给你一个数t作为最后等式的和,并给你一组数a[i](i<12)作为等式的加数,每个加数最多只能使用一次,要求输出所有满足条件(加数从大到小输出)的等式,并且不能重复。例:t=4. a[]={4,3,2,2,1,1}输出 4,3+1,2+2,2+1+1解题思路:题目要求输出从大到小输出,所以可以先给所有的数进行降序排序。数据的规模很小,所以可以用暴力搜索。搜索过程中,为了避免重复输出,需要记录前一层搜索的起点,下一层递归搜索的起点不能与前一层记录的点一样...说不清楚,具体见代码 1 #i 阅读全文

posted @ 2013-02-19 13:44 acoderworld 阅读(118) 评论(0) 推荐(0)

2013年2月9日

poj 3667--线段树

摘要: http://poj.org/problem?id=3667线段树,区间合并。代码: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define maxn 55555 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 int msum[maxn<<2],lsum[maxn<<2],rsum[maxn<<2]; 8 int flag[maxn<<2]; 9 阅读全文

posted @ 2013-02-09 20:14 acoderworld 阅读(60) 评论(0) 推荐(0)

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)

2013年2月6日

HDU 2048--错排

摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2048中文题,不解释。。错排证明:递推数列法对于排列数较多的情况,难以采用枚举法。这时可以用递归思想推导错排数的递推公式。显然D1=0,D2=1。当n≥3时,不妨设n排在了第k位,其中k≠n,也就是1≤k≤n-1。那么我们现在考虑第n位的情况。当k排在第n位时,除了n和k以外还有n-2个数,其错排数为Dn-2。当k不排在第n位时,那么将第n位重新考虑成一个新的“第k位”,这时的包括k在内的剩下n-1个数的每一种错排,都等价于只有n-1个数时的错排(只是其中的第k位会换成第n位)。其错排数为Dn-1。所以当n排 阅读全文

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

HDU 1166--线段树模板题

摘要: 中文题,不解释。线段树的模版题,暴力都可以过。。。思路:线段树区间求和。代码: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define lson l,m,(rt<<1) 5 #define rson m+1,r,(rt<<1|1) 6 const int maxn=50010; 7 int sum[maxn<<2]; 8 void Pushup(int rt) 9 {10 sum[rt]=sum[rt<<1] + sum[rt< 阅读全文

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

HDU 1754--线段树

摘要: 中文题,不解释。。思路:线段树功能:update:单点替换 quary:区间最值代码: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define maxn 200100 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 int Max[maxn<<2]; 8 int MMax(int a,int b) 9 {10 return a<b?b:a;11 }12 void Pushup( 阅读全文

posted @ 2013-02-06 21:50 acoderworld 阅读(39) 评论(0) 推荐(0)

HDU 1394--线段树(求逆序数)||暴力

摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1394题意:给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找出其中最小的一个输出!这里有个技巧,就是算完第一组的逆序数后,后面移动得来的逆序数可有sum+n-a[i]-1-a[i]得;暴力写法: 250msView Code 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int main() 阅读全文

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

导航