NC219233. alan的DP题
描述
输入描述
第一行两个数 ,
第二行n个数 ,注意 可能等于0
第三行m个数
输出描述
表示alan最多能获得的收益
示例1
输入:
4 3 3 1 0 1 2 0 1
输出:
9
说明:
C(clang11) 解法, 执行用时: 763ms, 内存消耗: 59888K, 提交时间: 2021-04-19 09:07:40
#include <stdio.h> #define N 3000005 int myset[N], xq[N]; void init() { for (int i = 1; i <= N; i++) { myset[i] = i; } } int find_set(int x) { return (xq[x] > 0|| !x) ? x : (myset[x] = find_set(myset[x])); } int main() { init(); int n, m; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &myset[i]); // 表示第i号商品包含myset[i]号商品的作用 } for (int i = 1; i <= m; i++) { int b; scanf("%d", &b); ++xq[b]; //表示b号商品需求+1 } long long ans = 0; for (int i = n; i >= 1; i--) { int t = find_set(i); if (xq[t]) { --xq[t]; ans += i; } } printf("%lld\n", ans); return 0; }
C++(clang++11) 解法, 执行用时: 721ms, 内存消耗: 39380K, 提交时间: 2021-04-19 13:52:13
#include<bits/stdc++.h> #define N 3000050 using namespace std; int fa[N], p[N], size[N], n, m; int get(int x) { return (fa[x] == x)? x : (fa[x] = get(fa[x])); } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++) scanf("%d", &p[i]), fa[i] = p[i]; for(int i = 1, x = 0; i <= m; i ++) scanf("%d", &x), size[x] ++, fa[x] = x; long long ans = 0; for(int i = n; i >= 1; i --) { int x = get(i); if(size[x]) { ans += i; size[x] --; if(!size[x]) fa[x] = p[x]; } } printf("%lld", ans); return 0; }