二维偏序-蓝桥20102,没写完
代码:
暴力:只过了35%,双重for循环o(n^2)=1e10;
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N=1e9+10;
typedef long long LL;
typedef pair<int,int> PII;
int main()
{
// 请在此输入您的代码
//相当于找该(x,y)位置 0~x,0~y这个矩形范围内存在的点数
int n,x,y;
int ans=0;
vector<PII> a;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&x,&y);
a.push_back({x,y});
}
sort(a.begin(),a.end());
//先排序,默认pair按第一个first来排,所以只用看第二个参数,有几个是满足yi<yj的(该位置之前的数,有几个<=现在的数)
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<i;j++){//区间[j,i] 1~i
if(a[j].second<=a[i].second&&(i!=j)){
cnt++;
}
}
ans+=cnt;
}
printf("%d",ans);
return 0;
}
注意这个vector是从下标为0开始的。我当时把for中i=1输入当成下标为1了,其实就是输n次
思路:
先看了题目给的表格有了一点想法,以该(x,y)为分界,左下方小于该点的点数和
后来排序后,发现可以从二维变一维,直接找在当前位置之前有几个数小于等于当前数的
注意i!=j
优化可以在一维这里优化,二重循环--->树状数组