题目:题目链接
题目:就是按照题目的判断条件,判断对于每一cow,有多少个cow比它stronger。
分析:100000头cow,如果直接for必须超,又是要用到树状数组来节省时间。按照每一个COW的左右坐标排序,这样就
可以比较了,后面的比较就可以参照前面的比较结果。这样一步一步的比较非常节省时间:
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int QuickMod(int a,int b,int n)
{
int r = 1;
while(b)
{
if(b&1)
r = (r*a)%n;
a = (a*a)%n;
b >>= 1;
}
return r;
}
#define maxn 100005
int c[maxn+1];
struct node
{
int x, y;
int ans;
int id;
} num[maxn+1];
int n;
int lowbit(int x)
{
return x & (-x);
}
void update(int i)
{
while(i < maxn)
{
c[i] ++;
i += lowbit(i);
}
}
int sum(int x)
{
int s = 0;
while(x > 0)
{
s += c[x];
x -= lowbit(x);
}
return s;
}
bool cmp(node a, node b)
{
if(a.x == b.x)
return a.y > b.y;
return a.x < b.x;
}
bool cmp1(node a, node b)
{
return a.id < b.id;
}
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
memset(c,0,sizeof(c));
memset(num,0,sizeof(num));
for(int i=0; i<n; i++)
scanf("%d%d",&num[i].x,&num[i].y),num[i].id=i,num[i].x++,num[i].y++;
sort(num,num+n,cmp);
for(int i=0; i<n; i++)
{
if(i&&num[i].y==num[i-1].y&&num[i].x==num[i-1].x) num[i].ans=num[i-1].ans;
else num[i].ans=i-sum(num[i].y-1);
update(num[i].y);
}
sort(num,num+n,cmp1);
for(int i=0; i<n-1; i++)
printf("%d ",num[i].ans);
printf("%d\n",num[n-1].ans);
}
return 0;
}
树状数组,每次都会有额....