思路很简单 每次调用函数保证左侧一定正确 但是没过qwq 喜欢这个思路的Uu可以改一下
源码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long int ll;
ll n, m;
typedef struct {
ll l;
ll r;
}node;
node a[200020];
ll dp(ll left, ll right,ll i) {
// dp
//left i suitable
if (a[i].r == right)return 1;//just Right exit;
if (a[i].r > right)return 0;
ll i_right = a[i].r;
ll j;
for (j= i + 1; j <= m; j++) {
if (a[j].l < left||a[j].r > right)continue;
// not suit
if (i_right<a[j].l) {
continue;//dont continue,there is gap
}
else {
ll tmp = dp(left, right, j);
if (tmp == 1)return 1;
continue;//this way is not correct
}
}//all is noe correct
return 0;
}
bool compare(node x, node y) {
if (x.l != y.l)return x.l<y.l;
return x.r > y.r;
}
int main() {
cin >> n >> m;
for (ll i = 1; i <= m; i++)
cin >> a[i].l >> a[i].r;
//initial
sort(a + 1, a +1+ m,compare);
//for (ll i = 1; i <= m; i++)cout << a[i].l << " " << a[i].r;
ll ans = 0;
for (ll i = 1; i <= n - 1; i++)
{
ll k1;
for (k1 = 1; k1 <= m; k1++)
if (a[k1].l == i)break;
if (k1 == m + 1)break;//dont suit
ll k2 = k1;
while (a[k2 + 1].l == i)k2++;
for (ll j = i + 1; j <= n; j++) {
for (ll k = k1; k <= k2; k++){ //k:a[k].l==i恰好符合
if (dp(i, j, k) == 1) {
ans += 1;//(i,j)这个二元组
//cout << endl << ":" << i << " " << j;
break;
}
}
}
}
cout << ans;
return 0;
}