对应POJ题目:点击打开链接
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 12588 | Accepted: 4174 |
Description
Input
Output
Sample Input
3 1 2 0 3 3 4 0
Sample Output
1 0 0
Hint
1.按E降序排序,E相等就按S升序排序,这样比i牛强的一定在i牛前面。
排序前:
3 6
4 9
1 8
2 7
4 6
4 9
排序后:
4 9
1 8
2 7
3 6
4 6
这样,会树状数组就能做了
#include<cstdio> #include<cstdlib> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<iostream> const int MAXN=100000+10; const int INF=1<<25; using namespace std; int c[MAXN]; int ans[MAXN]; struct edge { int s,e,k; }E[MAXN]; bool cmp(edge c1, edge c2) { if(c1.e != c2.e) return c1.e>c2.e; return c1.s<c2.s; } int lowbit(int x) { return x&(-x); } void updata(int x, int num) { while(x<=MAXN) { c[x]+=num; x+=lowbit(x); } } int sum(int x) { int res=0; while(x>0) { res+=c[x]; x-=lowbit(x); } return res; } int main() { //freopen("in.txt","r",stdin); int n; while(scanf("%d", &n), n) { memset(ans,0,sizeof(ans)); memset(c,0,sizeof(c)); int i,j; for(i=1; i<=n; i++){ scanf("%d%d", &E[i].s, &E[i].e); E[i].k=i; } sort(E+1, E+n+1, cmp); updata(E[1].s+1, 1); for(i=2; i<=n; i++){ if(E[i].s==E[i-1].s && E[i].e==E[i-1].e) ans[E[i].k]=ans[E[i-1].k]; else ans[E[i].k]=sum(E[i].s+1); updata(E[i].s+1, 1); } for(i=1; i<n; i++) printf("%d ", ans[i]); printf("%d\n", ans[n]); } return 0; }