牛客 - Wannafly挑战赛26 - C - 七彩线段(DP+离散)

本文介绍了一种使用动态规划(DP)解决Wannafly挑战赛中“七彩线段”问题的方法。面对10万条线段和7种颜色,通过状态压缩和离散化处理,设计了DP[i][j]来表示最后一个线段右端点位置<i,且包含j颜色的最大长度。文章详细展示了如何利用二进制数表示颜色状态,以及如何通过排序和二分查找提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Wannafly挑战赛26 - C - 七彩线段

由于颜色只有七种,线段有100000条,所以可以用DP[i][j]表示最后一个线段的右端点位置 < i,且包含 j 颜色的最大长度,(状态压缩,用七位二进制数表示七种颜色的状态)。

l,r范围较大,但n较小,所以将其进行离散化处理。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n, m, Rank[N*2], Rn;
int head[N<<1], nt[N<<1], _id[N<<1], sz;
struct node{
    int l, r, c, len;
    friend bool operator < (node a, node b) {
        return a.r < b.r;
    }
}a[N];
LL dp[N*2][(1<<7)+10];
int get_Rank(int x) {
    return lower_bound(Rank+1, Rank+1+Rn, x) - Rank;
}
int count(int x) {
    int ans = 0;
    while(x) {
        ans += x & 1;
        x >>= 1;
    }
    return ans;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i=1;i<=n;i++) {
        scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].c);
        a[i].len = a[i].r - a[i].l; a[i].c --;
        Rank[++Rn] = a[i].l; Rank[++Rn] = a[i].r;
    }
    sort(Rank+1, Rank+1+Rn);
    Rn = unique(Rank+1, Rank+1+Rn) - Rank - 1;
    sort(a+1, a+1+n);
    for(int i=1;i<=n;i++) {
        int rk = get_Rank(a[i].r);
        nt[++sz] = head[rk], _id[sz] = i, head[rk] = sz;
    }
    for(int i=1;i<=Rn;i++) {
        for(int j=0;j<1<<7;j++) {
            dp[i][j] = max(dp[i][j], dp[i-1][j]);
            for(int k=head[i]; k; k=nt[k]) {
                int to = _id[k];
                int col = (1<<a[to].c) | j;
                int pre = get_Rank(a[to].l)-1;
                if(dp[pre][j] == 0 && j) continue;
                dp[i][col] = max(dp[i][col], dp[pre][j] + a[to].len);
            }
        }
    }
    LL ans = 0;
    for(int i=1;i<1<<7;i++) {
        if(count(i) == m) ans = max(ans, dp[Rn][i]);
    }
    if(ans == 0) ans = -1;
    printf("%lld\n", ans);
    return 0;
}

 

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值