hdu_1541 Stars (树状数组)
来源:互联网 发布:域名实名认证 编辑:程序博客网 时间:2024/06/03 16:42
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541
分析:
题意即线段树方法解:http://blog.csdn.net/u010885608/article/details/9388695
用树状数组解得算法分析:插入(x,y)点,先统计[0,y]有多少点已插入,总数即为点(x,y)的Lev。再插入y值,更新。
我的代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAXN 32000+10#define N 15000struct Piont{ int x,y;};Piont p[N];int ans[N];bool cmp(Piont a,Piont b){ if(a.x!=b.x) return a.x<b.x; else return a.y<b.y;}int C[MAXN];int lowbit(int x){ return x&(-x);}int Max;void Modify_C(int index,int k) //更新树状数组下标为index的值。{ while(index<=Max+1) { C[index]+=k; //相关联的下标值一起被改变。 index+=lowbit(index); }}int Sum_C(int x) //求出[1,x]区间的和。C[1]的位置放0;{ int sum=0; while(x>0) { sum+=C[x]; x-=lowbit(x); } return sum;}int main(){ int n; while(scanf("%d",&n)!=EOF) { int i; Max=-1; //用Max找树状数组中最右端的值 for(i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); if(Max<p[i].y) Max=p[i].y; //注意这里只初始化的范围是[0,n],n表点的个数,如果有点(100,100),则C[100]没有初始。 // C[i]=0;//只要初始为0就可以了,不用转换,因为各区间和开始都是0; ans[i]=0; } memset(C,0,sizeof(C)); //一招初始,简单方便。 sort(p,p+n,cmp); for(i=0;i<n;i++) //开始插插入y; { int Lev; //避免0进入形成死循环,所以将0放在C[1]的位置, Lev=Sum_C(p[i].y+1); //统计[1,y+1]区间数的个数。即该点的Lev ans[Lev]++; Modify_C(p[i].y+1,1); //更新树状数组下标为index的值。 } for(i=0;i<n;i++) { printf("%d\n",ans[i]); } } return 0;}
总结:
1.能用树状数组的就用树状数组吧,线段树好难写-,-
2.用一个Max记录树状数组的最右端值,速度由60+MS减少到40+MS。。
- hdu_1541 Stars (树状数组)
- hdu_1541 Stars(线段树)
- Stars(树状数组)
- Stars(树状数组)
- Stars(树状数组)
- Stars(树状数组)
- Stars(树状数组)
- Stars(树状数组)
- poj2352 Stars (树状数组)
- POJ2352 Stars(树状数组)
- hdu1541 Stars(树状数组)
- HDU1541 Stars(树状数组)
- poj2352 Stars(树状数组)
- HDU1541--Stars(树状数组)
- poj2352 Stars(树状数组)
- POJ 2352 Stars(树状数组)
- poj 2352 Stars (树状数组)
- hdu 1541 Stars ( 树状数组 )
- js判断是手机访问还是电脑访问,进行自动跳转
- Linux下为命令取别名
- 新浪id转url (id转mid)
- 《你的知识需要管理》阅读
- C内存对齐
- hdu_1541 Stars (树状数组)
- Linux下Chrom浏览器的Bug
- CI19.11-和为定值的数对
- 程序员最害怕的5件事 你中招了吗?
- 【i love you】执笔写爱win7主题
- 展讯平台 camera驱动分析(sensor部分)
- POJ3159 差分约束系统
- Linux--1:linux 和 unix 的区别与联系
- java中异常处理机制