Deux vecteurs triés feront l'affaire.
- Pousser toutes les lignes dans le vecteur v1.
- Trier v1 par la constante c. Après cela, v1[0] est la ligne avec le plus petit c.
- Traversée v1 du début à la fin. Pour chaque élément e dans v1, nous ne devons considérer que l'élément visité avant (c1>c2). Il s'agit maintenant de trouver parmi tous les éléments visités, l'élément avec m2 > m1.
- Il suffit donc de placer les éléments qui ont été visités dans un vecteur v2, qu'il convient de trier par la pente m après chaque insertion (le BST auto-équilibré se charge de cette tâche). Puisque v2 est trié par m, une recherche binaire vous dira combien d'éléments satisfont m2>m1.
Le tri est n log n.
L'insertion à v2 est log n (elle peut être réalisée avec le BST auto-équilibré, et il sera invoqué n fois).
La recherche binaire est log n(invoquer n fois).
C'est donc O(nlog n)
Si vous écrivez cela en C++, ce sera comme cela( Je ne définis pas la v2, parce que vous allez mettre en œuvre une BST auto-équilibrée. ):
struct line
{
int c,m;
line(int a,int b):c(a),m(b){}
bool operator <(const line &a) const
{
return m>a.m;
}
};
bool cmp(const line &v1,const line &v2)
{
return v1.c<v2.c;
}
int main()
{
vector<line> v1;
v1.push_back(line(1,3));
v1.push_back(line(4,1));
v1.push_back(line(3,1));
v1.push_back(line(2,2));
sort(v1.begin(),v1.end(),cmp);
int ans=0;
for(int i=0;i<v1.size();i++)
{
int num=v2.find(v1[i]);//return the number of element whose m is larger than v1[i].
ans+=num;
v2.insert(v1[i]);// in every step, the element e in v2 will satisfy e.c<v1[i].c
}
cout << ans;
}
C'est tout. Si vous avez des questions, laissez-moi un commentaire.