LeeBlog

导航

随笔分类 -  树状数组

HDU 2689 POJ 2299 树状数组 + 离散化
摘要:以前都是直接树状数组裸奔,昨天一个题数据量好大,过不了,没办法只能学离散化,今天A了第一个离散化的题#include<stdio.h>#include<string.h>#include<stdlib.h>#define Max 500005long long s,a[Max];int n,max;struct e{ int num,f;}N[Max];int cmp( const void *a,const void *b ){ return ( ( e * )a ) -> num - ( ( e * )b ) -> num;}inline i 阅读全文

posted @ 2011-05-27 10:03 LeeBlog 阅读(179) 评论(0) 推荐(0)

HDU 1541 Stars
摘要:这题让我情何以堪啊,悲剧了以下午,居然是审题不仔细,我原以为是对应输出每个星星的等级,后来突然发现是求每个等级的星星数目;这题是个树状数组的题,因为只要算左下角的星星数目( 包括正左,正下 ),而且给出数据的方式又是先按X轴排列,再按Y轴排列( 按这样的方式算出来的等级都不会变了,因为这样它的左下方不能再加星星了,这样就可以直接看它左下方的星星数目,即相应的等级),使得我们可以用树状数组来做,当到( a,b )点时,只要看小于a( a的左下方星星 )的数目就可以知道这个星星是多少等级了,然后再把这个等级的星星数目增加1这样就很轻松的算出结果了#include<stdio.h>#in 阅读全文

posted @ 2011-04-07 21:18 LeeBlog 阅读(269) 评论(0) 推荐(0)

HDU 1196 lowest bit
摘要:这题是树状数组的一入门题,lowest bit 就是将相应的十进制转换成二进制,在这个二进制数种从右往左数第一个不为0的位置的权值,有一种简单的做法#include<stdio.h>int main( ){ int n; while( scanf( "%d",&n ) ,n ) printf( "%d\n",n&( -n ) );}比较常规的做法#include<stdio.h>int main( ){ int n,x,y; while( scanf( "%d",&n ) ,n ) { 阅读全文

posted @ 2011-04-07 13:25 LeeBlog 阅读(248) 评论(0) 推荐(0)

HDU 2689 sort it
摘要:此题就是求冒泡的次数,用冒泡做时间比较长,用树状数组做比较快#include<stdio.h>int num[1024],n;int main( ){ while( scanf( "%d",&n ) != EOF ) { for( int i = 0; i < n; ++i ) scanf( "%d",&num[i] ); int count = 0; for( int i = 0,f = 0; i < n - 1; ++i ) { f = 0; for( int j = 0; j + 1< n - i; + 阅读全文

posted @ 2011-04-05 14:23 LeeBlog 阅读(203) 评论(0) 推荐(0)

hdu 1166 敌兵布阵 树状数组 模板题
摘要:这题是树状数组入门的一模板题,非常基础,被小白成为"赤裸裸"的入门题,哈哈,一个plus,一个sum全部搞定#include<stdio.h>#include<string.h>#define lowbit( x ) ( x )&( -x )int tree[50024],num,n;void plus( int num,int x ){ while( x <= n ) { tree[x] += num; x += lowbit( x ); } }int sum( int x ){ int sum = 0; while( x ) { s 阅读全文

posted @ 2011-04-05 13:48 LeeBlog 阅读(419) 评论(0) 推荐(0)