标签:
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 13920 | Accepted: 4607 |
Description
Input
Output
Sample Input
3 1 2 0 3 3 4 0
Sample Output
1 0 0
Hint
Source
POJ Contest,Author:Mathematica@ZSU
题目大意:
给出n头牛,他们有两个属性x和y,当A牛的x比B牛的x小于或等于,A牛的y比B牛的y大于或等于,但x和y不能同时等于,则称为A牛比B牛更强大
问对每头牛,有多少头牛比他强大
ac代码
#include<stdio.h> #include<string.h> #include<stdlib.h> struct ss { int e,s,id; }b[100100]; int val[100100],a[100100]; int cmp(const void *a,const void *b) { if((*(struct ss *)a).s==(*(struct ss *)b).s) return (*(struct ss *)a).e-(*(struct ss *)b).e; return (*(struct ss *)b).s-(*(struct ss *)a).s; } int n; int lowbit(int x) { return x&(-x); } void update(int p,int q) { while(p<=n) { a[p]+=q; p+=lowbit(p); } } int sum(int p) { int ans=0; while(p>0) { ans+=a[p]; p-=lowbit(p); } return ans; } int main() { //int n; while(scanf("%d",&n)!=EOF,n) { int i; memset(val,0,sizeof(val)); memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { scanf("%d%d",&b[i].e,&b[i].s); b[i].id=i; b[i].e++; b[i].s++; } qsort(b+1,n,sizeof(b[0]),cmp); val[b[1].id]=sum(b[1].e); update(b[1].e,1); for(i=2;i<=n;i++) { if(b[i].e==b[i-1].e&&b[i].s==b[i-1].s) { val[b[i].id]=val[b[i-1].id]; } else { val[b[i].id]=sum(b[i].e); } update(b[i].e,1); } printf("%d",val[1]); for(i=2;i<=n;i++) { printf(" %d",val[i]); } printf("\n"); } }
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/45954651