csp202303-5施肥

 思路很简单 每次调用函数保证左侧一定正确 但是没过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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值