题目大意
给定N对二元组(s,e),对于第i对二元组(s[i],e[i]),在前1~i-1对二元组中计算出符合这样要求的二元组(s[j],e[j])的总数量,s[j]<=s[i],e[j]>=e[i],并且e[j]-s[j]>e[i]-s[i]。
题解
先按e降序排序,如果e相等则按s升序排序,这样处理之后,接下来就和POJ2352的stars的处理是一样的,对于第i个数,只要小于a[i].s的数都是符合要求的。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MAXN 100005 using namespace std; typedef struct { int x; int y; int id; } NODE; NODE a[MAXN]; int c[MAXN],f[MAXN]; int n; int lowbit(int x) { return x&-x; } int sum(int x) { int ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } void add(int x) { while(x<=MAXN) { c[x]++; x+=lowbit(x); } } bool cmp(NODE a,NODE b) { if(a.y==b.y) return a.x<b.x; return a.y>b.y; } int main(void) { int i,n,ans; while(scanf("%d",&n)!=EOF&&n) { memset(c,0,sizeof(c)); for(i=1; i<=n; i++) { scanf("%d%d",&a[i].x,&a[i].y); a[i].x++; a[i].y++; a[i].id=i; } sort(a+1,a+n+1,cmp); for(i=1;i<=n;i++) cout<<a[i].x<<' '<<a[i].y<<endl; for(i=1; i<=n; i++) if(i>1&&a[i].x==a[i-1].x&&a[i].y==a[i-1].y) { f[a[i].id]=ans; add(a[i].x); } else { ans=sum(a[i].x); f[a[i].id]=ans; add(a[i].x); } for(i=1; i<n; i++) printf("%d ",f[i]); printf("%d\n",f[i]); } }