首页 > 其他分享 >43. CF-Walk the Runway

43. CF-Walk the Runway

时间:2023-07-26 16:37:42浏览次数:51  
标签:std int Runway 43 Walk vector ind using dp

Walk the Runway

题意有点绕,在这里先简单解释一下:

有 \(n\) 个人和 \(m\) 个城市,每个人都有一个贡献值 \(p_i\),每个人对每个城市有一个打分 \(r_{i,j}\)。现在需要选出 \(k\) 个人,并确定他们的顺序,记为 \(a_1\cdots a_k\),这 \(k\) 个人把所有的城市都走一遍,要求对于每个城市,这 \(k\) 个人的评分都是递增的,即

\[\large r_{i,a_1}\lt r_{i,a_2}\lt \cdots \lt r_{i,a_k} \]

在满足该条件的情况下,要求最大化贡献值之和。

数据范围 \(n\le 5000,m\le 500\)。

容易想到 dp。如果 A 可以接在 B 的后面,则必须满足对于每个维度 A 都大于 B,也就是说可以进行拓扑排序。之后就是在 DAG 上进行 dp,dp 的复杂度是 \(O(n^2)\)。

问题是有 \(m\) 个维度,如果直接进行两两比较,拓扑排序的复杂度是 \(O(n^2 m)\),这是无法接受的。但是也没别的好办法,只好用 bitset 优化到 \(O(\frac{n^2m}{w})\),勉强能用。

#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using pii = std::pair<int, int>;
const int inf = 0x3f3f3f3f;
const int maxn = 3e5 + 5;

using bs = std::bitset<5000>;

void solve() {
    int m, n;
    cin >> m >> n;
    vector<ll> p(n);
    for (auto& i : p)
        cin >> i;
    vector<int> ind(n);
    std::iota(ind.begin(), ind.end(), 0);
    bs all_true;
    all_true.flip();
    vector<bs> can(n, all_true);
    vector<int> r(n);
    for (int d = 0; d < m; ++d) {
        for (auto& i : r)
            cin >> i;
        sort(ind.begin(), ind.end(), [&](int x, int y) {
            return r[x] < r[y];
            });
        bs prev;
        for (int i = 0; i < n; ) {
            int j = i;
            while (j < n && r[ind[j]] == r[ind[i]]) {
                can[ind[j]] &= prev;
                ++j;
            }
            while (i < j) {
                prev[ind[i]] = true;
                ++i;
            }
        }
    }
    auto dp = p;
    for (auto i : ind) {
        for (int j = 0; j < n; ++j) {
            if (can[i][j]) {
                dp[i] = std::max(dp[i], dp[j] + p[i]);
            }
        }
    }
    cout << *std::max_element(dp.begin(), dp.end()) << endl;
}

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    // cin >> T;
    for (int t = 1; t <= T; ++t) {
        solve();
    }
    return 0;
}

中间求拓扑序的代码可以当做高维偏序的模板来用。

标签:std,int,Runway,43,Walk,vector,ind,using,dp
From: https://www.cnblogs.com/theophania/p/p43.html

相关文章

  • uni-app vue-cli命令行创建项目,拉取模板(dcloudio/uni-preset-vue)失败,443超时报错
    安装vue/clinpminstall-g@vue/cli问题根据官网提示,通过vue-cli命令行创建项目,出现如下报错。Fetchingremotepresetdcloudio/uni-preset-vue...ERRORFailedfetchingremotepresetdcloudio/uni-preset-vue:ERRORRequestError:connectETIMEDOUT192.30.25......
  • 服务器防火墙,放行443端口,命令
    查看服务器防火墙是什么iptables和firewalld都是用于配置Linux系统防火墙的工具。两者的主要差异在于使用的命令和配置语法的不同。iptables是传统的防火墙工具,适用于几乎所有的Linux发行版,而firewalld更加适用于最新的CentOS7和RHEL7系统。命令sudofirew......
  • 题解 BZOJ4543【[POI2014] HOT-Hotels】
    长链剖分优化DP板子题了,但是虽然是板子这个转移方程也很难想。problem树。求\(\sum_{1\leqi<j<k\leqn}[dist(i,j)=dist(i,k)=dist(j,k)].\)。\(n\leq10^5\)。solution与重链剖分相似,长链剖分是将树剖成很多条长链。我们定义长儿子,为一个点的儿子中子树深度最大的一个儿......
  • LeetCode 热题 100 之 438. 找到字符串中所有字母异位词
    题目给定两个字符串 s 和p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。示例 1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba"......
  • R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化|
    原文链接:http://tecdat.cn/?p=24613最近我们被客户要求撰写关于社区发现算法的研究报告,包括一些图形和统计输出。我们在心理学网络论文中看到的一个问题是,作者有时会对其数据的可视化进行过度解释。这尤其涉及到图形的布局和节点的位置,例如:网络中的节点是否聚集在某些社区 ( ......
  • 1143. 最长公共子序列
    1143.最长公共子序列转载:https://www.bilibili.com/video/BV1ey4y1d7oD/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • Sublime Text (Build 4143) x64 激活
    下载、安装SublimeText41、官方下载地址:https://www.sublimetext.com/download2、下载完成后,直接安装即可激活1、使用浏览器打开网站:https://hexed.it,点击【打开文件】2、打开SublimeText安装目录下的sublime_text.exe文件,在【搜索】中输入:807805000f94c1,按回车键。3......
  • P4843题解
    P4843题解原题连接建模一到比较裸的有源汇上下界最小流。每条边必走一次,要求求出最小的流量。由于比较裸,这里当作上下界流的例题讲。什么是有源汇上下界最小流顾名思义,就是在最大流的基础上增加了边的最小经过流量,使得整个网络可行,并且找出最小流量的方案。一个比较朴实的......
  • HJ43 迷宫问题
    1.题目读题 HJ43 迷宫问题 考查点 2.解法思路 代码逻辑 具体实现importjava.util.ArrayList;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){//迷宫地图int[][]maze={......
  • 438. 找到字符串中所有字母异位词
    给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。示例1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba",它是"abc"......