#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 200000
int n,hash[N],ans[N];
struct node
{
int x,y;
}data[N];
int t[N];
void add(int i,int x)
{
while(i<=n)
{
ans[i]+=x;
i+=i&-i;
}
}
int sum(int i)
{
int to=0;
while(i>0)
{
to+=ans[i];
i-=i&-i;
}
return to;
}
bool cmpx(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
bool cmpy(node a,node b)
{
if(a.y!=b.y)
return a.y<b.y;
else
return a.x<b.x;
}
int main(void)
{
scanf("%d",&n);
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
scanf("%d%d",&data[i].x,&data[i].y);
sort(data+1,data+1+n,cmpx);
int xn=1;
for(int i=1;i<=n;i++)
{
int flag=0;
if(data[i].x!=data[i+1].x)
flag=1;
data[i].x=xn;
if(flag==1)
xn++;
}
sort(data+1,data+1+n,cmpy);
int yn=1;
for(int i=1;i<=n;i++)
{
int flag=0;
if(data[i].y!=data[i+1].y)
flag=1;
data[i].y=yn;
if(flag==1)
yn++;
}
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++)
{
if(t[data[i].x]<data[i].y)
t[data[i].x]=data[i].y;
}
int result=0;
memset(hash,0,sizeof(hash));
for(int i=1;i<n;i++)
{
if(hash[data[i].x]==0&&data[i].y!=t[data[i].x])
{
add(data[i].x,1);
hash[data[i].x]=1;
}
if(data[i].y==data[i+1].y)
{
if(data[i].x!=data[i+1].x)
result+=sum(data[i+1].x-1)-sum(data[i].x);
}
if(hash[data[i].x]==1&&data[i].y==t[data[i].x])
{
hash[data[i].x]=0;
add(data[i].x,-1);
}
}
printf("%d\n",result+n);
return 0;
}
poj 3109 Inner Vertices
最新推荐文章于 2020-05-27 17:10:39 发布