URAL 1028. Stars
2007-11-04 21:39
211 查看
problem url: http://acm.timus.ru/problem.aspx?space=1&num=1028
Got two methods here. One uses hash table which will give you O(Nsqrt(N)) , another uses segment tree(binary search..) which gives you O(Nlog(N))
**hash table approach:
#include <cstdio>
#include <cstddef>
#include <iostream>
#include <math.h>
#define MAX_XY 32000
#define MAX_COUNT 15000
using namespace std;
void main()
...{
int count = 0;
int i=0;
int sx,sy;
int bSize =0 ; //bucket size
int bNum = 0; //total bucket number
int p[MAX_XY+1] = ...{0};
int* lList = NULL;
int *b = NULL;
scanf("%d", &count);
bSize = (int)sqrt((double)MAX_XY);
bNum = (MAX_XY+1) / bSize + 1;
b = (int*)malloc(sizeof(int)*bNum);
memset(b, 0, sizeof(int)*bNum);
lList = (int*)malloc(sizeof(int) * count);
memset(lList, 0, sizeof(int)*count);
for(i =0;i<count;++i)
...{
int bCur = 0;//current bucket index
int lCur = 0;//current level
scanf("%d %d", &sx, &sy);
bCur = sx / bSize;
/**/////calculate level
int j = 0;
for(j =0; j<bCur;++j)
...{
lCur += b[j];
}
for(j= bSize*bCur; j<=sx; ++j)
...{
lCur += p[j];
}
lList[lCur]++;
/**////////////////////
b[bCur]++;
p[sx]++;
}
//print out result
for(i=0;i<count;++i)
...{
printf("%d ",lList[i]);
}
free(b);
free(lList);
}
**segment tree approach:
#include <cstdio>
#include <cstddef>
#include <iostream>
#include <math.h>
#define MAX_XY 32000
#define MAX_COUNT 15000
int vals[MAX_XY *4 +1] = ...{0};
int lList[MAX_COUNT];
using namespace std;
void insertstar(int p, int b, int e, int x)
...{
int m = (b+e) >> 1;
if(e != b)
...{
if(x <= m)
...{
insertstar(p<<1, b, m, x);
}else
...{
insertstar((p<<1)+1, m+1, e, x);
}
}
vals[p] ++;
}
int getlevel(int p, int b, int e, int x)
...{
int m = (b+e) >> 1;
if( e == b)
...{
return vals[p];
}
else
...{
if( x == e)
...{
return vals[p];
}
else if(x > m)
...{
return getlevel(p<<1, b, m, m) + getlevel((p<<1)+1,m+1, e, x);
}else
...{
return getlevel(p<<1, b, m, x);
}
}
}
void main()
...{
int count = 0;
int i=0;
int sx,sy;
//get star number
//cin>>count;
scanf("%d", &count);
memset(lList, 0, sizeof(int)*MAX_COUNT);
for(i =0;i<count;++i)
...{
int lCur = 0;//current level
//cin>>sx>>sy;
scanf("%d %d", &sx, &sy);
//get level
lCur = getlevel(1, 0, MAX_XY, sx);
lList[lCur]++;
insertstar(1,0,MAX_XY,sx);
/**////////////////////
}
for(i=0;i<count;++i)
...{
printf("%d ",lList[i]);
}
}
Got two methods here. One uses hash table which will give you O(Nsqrt(N)) , another uses segment tree(binary search..) which gives you O(Nlog(N))
**hash table approach:
#include <cstdio>
#include <cstddef>
#include <iostream>
#include <math.h>
#define MAX_XY 32000
#define MAX_COUNT 15000
using namespace std;
void main()
...{
int count = 0;
int i=0;
int sx,sy;
int bSize =0 ; //bucket size
int bNum = 0; //total bucket number
int p[MAX_XY+1] = ...{0};
int* lList = NULL;
int *b = NULL;
scanf("%d", &count);
bSize = (int)sqrt((double)MAX_XY);
bNum = (MAX_XY+1) / bSize + 1;
b = (int*)malloc(sizeof(int)*bNum);
memset(b, 0, sizeof(int)*bNum);
lList = (int*)malloc(sizeof(int) * count);
memset(lList, 0, sizeof(int)*count);
for(i =0;i<count;++i)
...{
int bCur = 0;//current bucket index
int lCur = 0;//current level
scanf("%d %d", &sx, &sy);
bCur = sx / bSize;
/**/////calculate level
int j = 0;
for(j =0; j<bCur;++j)
...{
lCur += b[j];
}
for(j= bSize*bCur; j<=sx; ++j)
...{
lCur += p[j];
}
lList[lCur]++;
/**////////////////////
b[bCur]++;
p[sx]++;
}
//print out result
for(i=0;i<count;++i)
...{
printf("%d ",lList[i]);
}
free(b);
free(lList);
}
**segment tree approach:
#include <cstdio>
#include <cstddef>
#include <iostream>
#include <math.h>
#define MAX_XY 32000
#define MAX_COUNT 15000
int vals[MAX_XY *4 +1] = ...{0};
int lList[MAX_COUNT];
using namespace std;
void insertstar(int p, int b, int e, int x)
...{
int m = (b+e) >> 1;
if(e != b)
...{
if(x <= m)
...{
insertstar(p<<1, b, m, x);
}else
...{
insertstar((p<<1)+1, m+1, e, x);
}
}
vals[p] ++;
}
int getlevel(int p, int b, int e, int x)
...{
int m = (b+e) >> 1;
if( e == b)
...{
return vals[p];
}
else
...{
if( x == e)
...{
return vals[p];
}
else if(x > m)
...{
return getlevel(p<<1, b, m, m) + getlevel((p<<1)+1,m+1, e, x);
}else
...{
return getlevel(p<<1, b, m, x);
}
}
}
void main()
...{
int count = 0;
int i=0;
int sx,sy;
//get star number
//cin>>count;
scanf("%d", &count);
memset(lList, 0, sizeof(int)*MAX_COUNT);
for(i =0;i<count;++i)
...{
int lCur = 0;//current level
//cin>>sx>>sy;
scanf("%d %d", &sx, &sy);
//get level
lCur = getlevel(1, 0, MAX_XY, sx);
lList[lCur]++;
insertstar(1,0,MAX_XY,sx);
/**////////////////////
}
for(i=0;i<count;++i)
...{
printf("%d ",lList[i]);
}
}
相关文章推荐
- Ural 1028. Stars 线段树单点更新
- ural 1028. Stars 树状数组
- ural 1028. Stars (线段树)
- Ural 1028. Stars
- Ural 1028. Stars
- Ural 1028. Stars
- URAL 1557 连通性
- URAL 1709 Penguin-Avia
- URAL 1221 Malevich Strikes Back! (DP动态规划 O(n^2) )
- ural 1217. Unlucky Tickets
- URAL 1018 Binary Apple Tree (树形DP)
- URAL 1018 Binary Apple Tree (树形DP)
- URAL 2040 Palindromes and Super Abilities 2
- URAL 1204 Idempotents
- URAL 1289 One Way Ticket
- ural 1244. Gentlemen
- ural 1431. Diplomas
- URAL 1684 Jack's Last Word
- ural 1338. Automobiles
- URAL 1128 Partition into Groups