poj 2481 树状数组
2016-08-23 15:46
211 查看
poj 2481 树状数组
题目大意:有n个cow,每一个都有自己的区间,如果a是b的真子集,则说b比a强。
问每个cow比多少个cow弱。
分析:
即求一个区间是多少个区间的真子集。把cow按s的升序排列,若相等则按e的降序排列,
然后依次加入树状数组,加入前记录e大于当前e【i】的cow数量。然后按顺序输出即可。可用结构体记录cow的相关参数。
注意:Huge input and output,scanf and printf is recommended.
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100005
#define lowbit(x) (x&-x)
using namespace std;
int c
,ans
;
struct Node
{
int s,e,pos;
}cow
;
void add(int k,int d){
while(k<=N){
c[k]+=d;
k+=lowbit(k);
}
}
int sum(int k){
int res=0;
while(k){
res+=c[k];
k-=lowbit(k);
}
return res;
}
bool cam(Node a,Node b){
if(a.s==b.s)return a.e>b.e;
return a.s<b.s;
}
int main() {
int n;
while(EOF!=scanf("%d",&n),n){
for (int i = 1; i <= n; ++i)
{
scanf("%d%d",&cow[i].s,&cow[i].e);
cow[i].s++;cow[i].e++;
cow[i].pos=i;
}
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
sort(cow+1,cow+1+n,cam);
for (int i = 1; i <= n; ++i)
{
if(cow[i].s==cow[i-1].s && cow[i].e==cow[i-1].e)
ans[cow[i].pos]=ans[cow[i-1].pos];
else
ans[cow[i].pos]=sum(N)-sum(cow[i].e-1);
add(cow[i].e,1);
}
for (int i = 1; i < n; ++i)printf("%d ", ans[i]);
printf("%d\n", ans
);
}
return 0;
}
题目大意:有n个cow,每一个都有自己的区间,如果a是b的真子集,则说b比a强。
问每个cow比多少个cow弱。
分析:
即求一个区间是多少个区间的真子集。把cow按s的升序排列,若相等则按e的降序排列,
然后依次加入树状数组,加入前记录e大于当前e【i】的cow数量。然后按顺序输出即可。可用结构体记录cow的相关参数。
注意:Huge input and output,scanf and printf is recommended.
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100005
#define lowbit(x) (x&-x)
using namespace std;
int c
,ans
;
struct Node
{
int s,e,pos;
}cow
;
void add(int k,int d){
while(k<=N){
c[k]+=d;
k+=lowbit(k);
}
}
int sum(int k){
int res=0;
while(k){
res+=c[k];
k-=lowbit(k);
}
return res;
}
bool cam(Node a,Node b){
if(a.s==b.s)return a.e>b.e;
return a.s<b.s;
}
int main() {
int n;
while(EOF!=scanf("%d",&n),n){
for (int i = 1; i <= n; ++i)
{
scanf("%d%d",&cow[i].s,&cow[i].e);
cow[i].s++;cow[i].e++;
cow[i].pos=i;
}
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
sort(cow+1,cow+1+n,cam);
for (int i = 1; i <= n; ++i)
{
if(cow[i].s==cow[i-1].s && cow[i].e==cow[i-1].e)
ans[cow[i].pos]=ans[cow[i-1].pos];
else
ans[cow[i].pos]=sum(N)-sum(cow[i].e-1);
add(cow[i].e,1);
}
for (int i = 1; i < n; ++i)printf("%d ", ans[i]);
printf("%d\n", ans
);
}
return 0;
}
/*测试数据 5 3 4 3 5 3 6 2 4 1 5 */
相关文章推荐
- POJ 2481 cows 树状数组
- poj 2481 cows 树状数组
- 树状数组水题小结 Poj 2352 + 2481 + 3067
- POJ 2481 cows 树状数组
- 树状数组简单poj 2481
- (POJ 2481)Cows 树状数组
- poj 2481 树状数组
- POJ 2481 树状数组
- POJ 2481 Cows 树状数组
- POJ 2481 树状数组
- 树状数组 POJ 2481 Cows
- poj 2481 树状数组
- poj 2481 树状数组
- Cows - POJ 2481 树状数组
- POJ 2352_Stars && POJ-2481 Cows (线段树单点更新+树状数组)
- 树状数组 POJ 2481 Cows
- POJ 2481 树状数组
- poj2481~Cows~(树状数组)
- POJ(2481)Cows 树状数组
- POJ 2481 Cows 树状数组