poj2481 Cows(树状数组)
2017-03-03 18:28
369 查看
http://poj.org/problem?id=2481
题意:农民发现山上长了一排三叶草,他有n个牛。每个牛都有自己喜爱的吃草范围[st,ed],如果说牛i的st比j的小,ed比j的大,就说牛i比牛j强壮。问每头牛都有多少头牛比自己强壮。
思路:说白了就是求有多少区间覆盖了当前区间。同样的也是10^5^2的大数据,用数状数组,不过用树状数组处理区间还是第一次。比牛j强的牛i要满足两个条件,i的st小于j的st且i的ed大于j的ed。为了方便,就要先确定一方的大小,然后判断另一方满足条件的个数。这里把区间按照ed从大到小、相等的st从小到大排列。按照ed从大到小的顺序遍历,那么已经满足i的ed大于j的ed,只需判断是否i的st小于j的st,若是,则个数加一,和那道星星一样。
加了结构体稍微麻烦了些,不过这样会超时。由于题中说Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj,满足最后一个条件才能算i比j强,但是区间相等的话就不能判断谁强谁弱,这样的话已知了比j牛强的牛的个数,比牛i强的也是一样的,不必再去执行求和操作。另外,输出也要注意下,尽量用耗时少的。
题意:农民发现山上长了一排三叶草,他有n个牛。每个牛都有自己喜爱的吃草范围[st,ed],如果说牛i的st比j的小,ed比j的大,就说牛i比牛j强壮。问每头牛都有多少头牛比自己强壮。
思路:说白了就是求有多少区间覆盖了当前区间。同样的也是10^5^2的大数据,用数状数组,不过用树状数组处理区间还是第一次。比牛j强的牛i要满足两个条件,i的st小于j的st且i的ed大于j的ed。为了方便,就要先确定一方的大小,然后判断另一方满足条件的个数。这里把区间按照ed从大到小、相等的st从小到大排列。按照ed从大到小的顺序遍历,那么已经满足i的ed大于j的ed,只需判断是否i的st小于j的st,若是,则个数加一,和那道星星一样。
加了结构体稍微麻烦了些,不过这样会超时。由于题中说Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj,满足最后一个条件才能算i比j强,但是区间相等的话就不能判断谁强谁弱,这样的话已知了比j牛强的牛的个数,比牛i强的也是一样的,不必再去执行求和操作。另外,输出也要注意下,尽量用耗时少的。
#include <stdio.h> #include <algorithm> #include <string.h> #include <math.h> using namespace std; typedef long long ll; const int N = 100001; int tree ;//从当前元素开始连续往左求lowbit(x)个数的和 int num ;//表示比当前end值大的牛中小于本牛start的牛有多少个 struct node { int st, ed; int id; }range ; bool cmp(node p1, node p2) { if(p1.ed != p2.ed) return p1.ed>p2.ed; else return p1.st<p2.st; } int lowbit(int x) { return -x&x; } void add(int x) { while(x < N) { tree[x]+=1; x+=lowbit(x); } } int sum(int x) { int num = 0; while(x > 0)//说明还有组可加 { num+=tree[x]; x-=lowbit(x); } return num; } int main() { // freopen("in.txt", "r", stdin); int n; while(~scanf("%d", &n)) { if(n == 0) break; memset(num, 0, sizeof(num)); memset(tree, 0, sizeof(tree)); for(int i = 1; i <= n; i++) { scanf("%d%d", &range[i].st, &range[i].ed); range[i].st++;//题中st从0开始 range[i].id = i; } sort(range+1, range+n+1, cmp); for(int i = 1; i <= n; i++)//排完序后就先遍历截止时间大的 { if(i>1 && range[i].st==range[i-1].st && range[i].ed==range[i-1].ed) num[range[i].id] = num[range[i-1].id];//判重为了防止超时 else num[range[i].id] = sum(range[i].st);//比当前牛强的牛的个数 add(range[i].st); } printf("%d", num[1]); for(int i = 2; i <= n; i++) printf(" %d", num[i]); printf("\n"); } return 0; }
相关文章推荐
- POJ2481:Cows(树状数组)
- poj2481 Cows(树状数组)
- poj2481 Cows 树状数组 解题报告
- 【树状数组--求逆序数】poj2481 Cows
- 【树状数组】Cows (POJ2481) PASCA…
- [树状数组]poj2481 Cows
- POJ2481 Cows (树状数组)
- POJ2481:Cows(树状数组)
- poj2481 Cows (树状数组)
- poj 2481 Cows(树状数组)
- poj2481 Cows(树状数组)
- poj 2481 Cows(树状数组)
- poj 2481 Cows 树状数组
- poj 2481 Cows 树状数组解法,详细解析。
- poj 2481 Cows(树状数组)
- POJ 2481 Cows【树状数组】
- poj 2481 Cows (树状数组)
- POJ 2481 Cows (树状数组)
- POJ-2481 Cows (树状数组 入门题)
- POJ 2481 Cows (树状数组)