별 별의 수

https://loj.ac/problem/10114

제목 설명

  감안 \ (\ N-)는 수평 및 수직 좌표의 점의 수만큼보다 작은 평면 상 스타 등급의 정의에 의해 주어진다 y 좌표의 오름차순으로, 점의 좌표, 각 클래스 별 추구 수.

생각

  때문에의 \ (Y \) 좌표가 증가하는 순서로 주어진, 그래서 우리는 고려할 필요가있다 \ (X \) 의 x 좌표 범위가 상대적으로 작기 때문에, 우리가 직접 유지할 수있는 좌표 가로 좌표 적은 \ (I \) 포인트 수는 접두사와 펜윅 트리 유지 관리 할 수 있습니다 할 수 있습니다. 그러나, 배열은 표시된 트리 아래에 유지 될 수 있습니다 (0 \) \ 때문에, 케이스 (\ lowbit (0) = 0 \) 이므로에있을 \ (X 축 + 1 \) .

코드

#include<bits/stdc++.h>
using namespace std;
const int N=32010;

int read()
{
    int res=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
    return res*w;
}
void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10^48);
}
void writeln(int x)
{
    write(x);
    putchar('\n');
}

int c[N+5],ans[N+5];
void update(int x,int v){for(;x<=N;x+=x&-x)c[x]+=v;}
int query(int x)
{
    int res=0;
    for(;x;x-=x&-x)res+=c[x];
    return res;
}

int main()
{
    int n=read();
    for(int i=1;i<=n;i++)
    {
        int x=read()+1,y=read();
        int v=query(x);
        update(x,1);
        ans[v]++;
    }
    for(int i=0;i<n;i++)
        printf("%d\n",ans[i]);
}

추천

출처www.cnblogs.com/fangbozhen/p/11754608.html