【代码有点问题待修正】
题意:找有多少个满足的形:

与牛客的数三角都是1类的题,枚举嘛~,,,点越多越麻烦就是了。以下是看完题解后的感想。
学到的语法东西:
1.struct 中那个是友元函数,可以重载操作符,就不用写sort的那个cmp了。
2.指针挺好的,可以以后多用用。
3.enum是枚举类型,跟define作用差不多。
忘了的话,参考链接:https://www.bilibili.com/video/av11828716?from=search&seid=13528813215642475026
4.std::的作用

那是命名空间,你所用到的很多函
数或者类都是被放到命名空间里面的,
命名空间是防止名字重复而使用的,
比如STL有个类叫string,而你也
设计一个类叫string,那么编译器
编译的时候就搞不清楚到底是那个string.

代码的思路:
逆时针标记5点(从1开始)
这个是枚举5点的思路
对于每个5点, 我们向前找到可用的所有3,4点, 1,2点是分隔点,对于每个1点, 它可用的4点组合都是x介于1和5两个点之间的点,2点是5点左边任何一个y与5点相同的点,可以发现, 对于一个给定的1点, 做一遍前缀和就可以算出它能够与多少2,3点的组合进行匹配,然后, 对于每个1点,其所可能的2,3点组合与可能的4点组合相乘。把这些结果相加就是最后结果了。

#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
struct Point {
   
	int x,y;
	friend bool operator<(const Point &a, const Point &b) {
   
		a.x < b.x;
	}
}pts[5001];
int n;
void solve();
int add(int a,int b) {
   
	return (a+b)%mod;
}
int main()
{
   
	int t;
	scanf("%d", &t);
	while(t--) {
   
		scanf("%d", &n);
		for(int i=1; i<=n; i++) {
   
			scanf("%d %d", &pts[i].x, &pts[i].y);
		}
		std::sort(pts+1,pts+n+1);
		solve();
	}
	return 0;
}
int post[5001];
int sig[5001];
int sumcis[5001],sumbeg[5001];
enum sigty{
   
	EQ,
	GT,
};
void solve() {
   
	int res=0;
	for(int now=1; now<=n; now++) {
   
		int lim=1;
		post[1]=0;
		for(Point *it=pts+now-1; it!=pts; it--) {
   
			if(it->y < pts[now].y)
				++post[lim];
			else{
   
				++lim;
				post[lim]=0;
				sig[lim]= it->y == pts[now].y ? EQ:GT;	
			}
			for(int i=2; i<=lim; i++)
				sumcis[i]=add(post[i-1],sumcis[i-1]);
			int fac=0;
			sumbeg[lim+1]=0;
			for(int i=lim;i>0; i--)
			{
   
				sumbeg[i]=add(sumbeg[i+1],fac*post[i]%mod);
				if(sig[i]==EQ)
					++fac;
			} //point 2th and 3th zuhe 
			for(int i=1; i<=lim; i++) {
   
				if(sig[i]==GT)
					res=add(res,sumcis[i] * sumbeg[i]%mod);
			}
		}
	}
	printf("%d\n",res);
}