POJ 2481 Cows
2015-12-18 13:13
183 查看
这道题是要求e更大且s更小的牛的数量,首先把所有的数据读入之后按照e从大到小,e相同的情况下s从小到大的顺序来排列;
从头开始遍历,这样能够保证e一定比前面的小,只要数前面有多少个s比自己的s小就可以计算出来有多少牛比自己更强,这种每次都要遍历数前面有多少个s比自己小的题目最好使用树状数组,能够更快地检索。
从头开始遍历,这样能够保证e一定比前面的小,只要数前面有多少个s比自己的s小就可以计算出来有多少牛比自己更强,这种每次都要遍历数前面有多少个s比自己小的题目最好使用树状数组,能够更快地检索。
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> using namespace std; #define maxn 500500 struct node{ int e,s; int index; }; bool operator <(node a,node b){ if(a.e == b.e) return a.s < b.s; return a.e > b.e; } node cow[maxn]={0}; int cnt[maxn]={0}; int tree[maxn]={0}; int getsum(int k){ int sum = 0; for(;k>0;k-=k&(-k)){ sum += tree[k]; } return sum; } void add(int k,int n){ for(;k<=n;k+=k&(-k)){ tree[k]++; } } int main(){ int n; while(scanf("%d",&n),n){ memset(cnt,0,sizeof(cnt)); memset(tree,0,sizeof(tree)); memset(cow,0,sizeof(cow)); for(int i=1;i<=n;++i){ scanf("%d%d",&cow[i].s,&cow[i].e); cow[i].index = i; } sort(cow+1,cow+1+n); add(cow[1].s+1, n); for(int i=2;i<=n;++i){ if(cow[i].s == cow[i-1].s && cow[i].e == cow[i-1].e){ cnt[cow[i].index] = cnt[cow[i-1].index]; } else{ cnt[cow[i].index] = getsum(cow[i].s+1); } add(cow[i].s+1, n); } for(int i=1;i<=n;++i){ printf("%d ",cnt[i]); } printf("\n"); } return 0 4000 ; }
相关文章推荐
- Ejb的实体bean
- 7 Java Performance Metrics to Watch After a Major Release--转
- 快捷找jar包方式
- 小喇叭上面有红叉,显示未插入扬声器或耳机,电脑没声音
- HDOJ 3309 Roll The Cube
- android studio 2.0
- 預約申領往來港澳通行證及簽注x
- ruby中Block, Proc 和 Lambda 浅析
- 12月18号 property关键字
- ajax中return取不到值的问题
- crontab shell调用spark-sql,实现周期性动态SQL批量自动执行
- ios 字符串判断是否包含字符
- 解决windows2003桌面不显示的问题
- js实现双击后网页自己主动跑-------Day55
- MIT Introduction to Algorithms 学习笔记(三)
- ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
- getJSONObject与optJSONObject的区别,结合源码分析
- getJSONObject与optJSONObject的区别,结合源码分析
- Android进阶笔记09:Android开发经验部分总结
- hdu 1203 (01背包)