首页 > 其他分享 >2024/10/13 模拟赛总结

2024/10/13 模拟赛总结

时间:2024-10-14 19:25:17浏览次数:7  
标签:10 13 freopen int kMaxN 2024 && genshin dp

人机体检,\(0+0+0+0=0\),打代码源去了

#A. 一般图最小匹配

下次看到这种范围一定要想到 dp 啊,令 \(dp_{i,j}\) 为前 \(i\) 个元素选了 \(j\) 对点的最小代价

由于边权是绝对值,可以对原数组排一遍序,选取的两个点就一定在排序后数组的相邻节点

那么就可以得出式子:\(dp_{i,j}=\min\{dp_{i-1,j},dp_{i-2,j-1}+a_i-a_{i-1}\}\)

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 5e3 + 5;

int n, m, a[kMaxN];
LL dp[kMaxN][kMaxN >> 1];

int main() {
	freopen("match.in", "r", stdin), freopen("match.out", "w", stdout);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  sort(a + 1, a + n + 1), fill(dp[0] + 1, dp[2], 1e18), dp[1][0] = 0;
  for (int i = 2; i <= n; i++) {
    dp[i][0] = 0;
    for (int j = 1; j <= m; j++) {
      dp[i][j] = min(dp[i - 1][j], dp[i - 2][j - 1] + a[i] - a[i - 1]);
    }
  }
  cout << dp[n][m] << '\n';
  return 0;
}

#B. 重定向

对于未填入的数,直接从小到大天然有剩余的数即可

对于每一位,考虑删掉它会不会更优,当 \(a_i>a_{i+1}\) 时,删掉 \(i\) 会更优,否则会更劣

如果 \(a_{i+1}=0\),且其本来应该填入 \(x\),用 \(x\) 和 \(a_i\) 来比较是否要删除即可

如果 \(a_i=0\),按同样的方式考虑

使用 set 维护每一个位置本来填入的数然后按照上面判断即可

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 2e5 + 5;

int t, n, a[kMaxN], e[kMaxN], genshin[kMaxN];
set<int> s;

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("redirect.in", "r", stdin), freopen("redirect.out", "w", stdout);
  for (cin >> t, iota(genshin + 1, genshin + kMaxN, 1); t; t--, s.clear()) {
    cin >> n, for_each(genshin + 1, genshin + n + 1, [](int i) { s.insert(i); });
    for (int i = 1; i <= n; i++) {
      cin >> a[i], a[i] && s.erase(a[i]);
    }
    e[n + 1] = a[n + 1] = n + 1;
    for (int i = n; i; i--) {
      e[i] = (a[i] && a[i] < a[e[i + 1]]) ? i : e[i + 1];
    }
    for (int i = 1; i <= n; i++) {
      if (i == n || a[i] && a[i + 1] && a[i] > a[i + 1]) {
        a[i] = -1;
        break;
      }
      if (!a[i]) {
        if (a[e[i]] < *s.begin()) {
          a[e[i]] = -1;
          break;
        }
      } else if (!a[i + 1]) {
        if ((a[i] >= *s.begin() || !a[i]) && *s.begin() < a[i]) {
          a[i] = -1;
          break;
        }
      }
      !a[i] && (s.erase(s.begin()), 0);
    }
    s.clear(), for_each(genshin + 1, genshin + n + 1, [](int i) { return s.insert(i); });
    for (int i = 1; i <= n; i++) {
      ~a[i] && s.erase(a[i]);
    }
    for (int i = 1; i <= n; i++) {
      if (a[i] && ~a[i]) {
        cout << a[i] << ' ';
      } else if (~a[i]) {
        cout << *s.begin() << ' ', s.erase(s.begin());
      }
    }
    cout << '\n';
  }
  return 0;
}

#C. 斯坦纳树

令不在关键点集中的点为虚点,然后对所有相连的边权为 \(0\) 的点由于斯坦纳树的性质可以缩成一个点。当这个集合中有任意一个点在点集中就当作这整个点都在点集中

然后倒着枚举一遍如果没有虚点则答案为 \(1\),否则为 \(0\)

// BLuemoon_
#include <bits/stdc++.h>

using namespace std;
using pii = pair<int, int>;

const int kMaxN = 3e5 + 5;

int n, cnt, tot, c[kMaxN], p[kMaxN], k[kMaxN], pre[kMaxN], ans[kMaxN], f[kMaxN];
bitset<kMaxN> vis;
vector<pii> e[kMaxN];
vector<int> g[kMaxN];
set<pii> s;
set<int> o[kMaxN];

void DFS(int u) {
  c[u] = cnt;
  for (auto [v, w] : e[u]) {
    if (!c[v] && !w) {
      DFS(v);
    }
  }
}
void DFS1(int u, int fa) {
  f[u] = fa;
  for (int v : g[u]) {
    if (v != fa) {
      o[u].insert(v), DFS1(v, u);
    }
  }
}
void Calc(int u, int tmp = 0) {
  if (o[u].size() == 0) {
    o[f[u]].erase(u);
    if (o[f[u]].size() == 1 && vis[f[u]] == 1) {
      Calc(f[u]);
    }
  } else if (o[u].size() == 1) {
    tot -= vis[u], tmp = *o[u].begin(), f[tmp] = f[u];
    o[f[u]].erase(u), o[f[u]].insert(tmp);
  } else {
    tot++, vis[u] = 1;
  }
}
int main() {
  freopen("tree.in", "r", stdin), freopen("tree.out", "w", stdout);
  cin >> n;
  for (int i = 1, u, v, w; i < n; i++) {
    cin >> u >> v >> w, w = w ? 1 : 0, e[u].push_back({v, w}), e[v].push_back({u, w});
  }
  for (int i = 1; i <= n; i++) {
    cin >> p[i];
  }
  for (int i = 1; i <= n; i++) {
    if (!c[i]) {
      cnt++, DFS(i);
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[c[p[i]]]) {
      vis[c[p[i]]] = 1, pre[i] = c[p[i]];
    }
  }
  for (int i = 1; i <= n; i++) {
    for (auto [j, w] : e[i]) {
      int u = c[i], v = c[j];
      (u > v) && (swap(u, v), 0);
      if (u != v) {
        if (s.find({u, v}) == s.end()) {
          s.insert({u, v}), g[u].push_back(v), g[v].push_back(u);
        }
      }
    }
  }
  DFS1(c[p[1]], 0);
  vis.reset(), ans[1] = 1;
  for (int i = n; i - 1; i--) {
    ans[i] = tot == 0, pre[i] && (Calc(pre[i]), 0);
  }
  for (int i = 1; i <= n; i++) {
    cout << ans[i];
  }
  return 0;
}

#D. 直径

一道巨大的 dp 题,不想写

标签:10,13,freopen,int,kMaxN,2024,&&,genshin,dp
From: https://www.cnblogs.com/bluemoon-blog/p/18463063

相关文章

  • 2024.10.14 test
    B平面上有\(n\)个点以及\(k\)条未知的平行线,每个点都分属一条线,每条线都有至少\(2\)点。给出一种方案。\(n\le4e4,k\le50\)。每个点分属一条线的条件非常重要。考虑利用鸽巢原理。考虑取出\(k+1\)个没有两对点同斜率的点,那么,至少有两个点在一条线上,那么就可以确定斜......
  • 【2024潇湘夜雨】WIN10_Ent-G_22H2.19045.5011软件选装纯净特别版10.14
    【系统简介】=============================================================1.本次更新母盘来自WIN10_Ent-G_22H2.19045.5011.进桌面后稍等片刻,等待后续部分优化完成。2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能......
  • 题解:P11132 【MX-X5-T4】「GFOI Round 1」epitaxy
    ProblemLink【MX-X5-T4】「GFOIRound1」epitaxy题目描述给你两个正整数\(n,m\)。定义一个\(1\simn\)的排列\(p\)的价值为所有的\(n-m+1\)个长度为\(m\)的连续子串内最大值的最大公因数。(规定单个数的最大公因数为其自身。)请你求出一个在所有\(1\simn\)......
  • 题解:P9137 [THUPC 2023 初赛] 速战速决
    ProblemLink[THUPC2023初赛]速战速决题目描述题意清晰,不再过多赘述。Solution每张不同的卡是等效的。小\(J\)手上的卡牌只有\(2\)种情况:手上没有相同的牌和有相同的牌。情况\(1\):小\(J\)手上的牌等价于\(1\simn\)(但其实没用),令其手上的牌为\(b_1,b_2,\ldo......
  • 2024最详细的Java八股文合集!
    1、HashMap底层,插入,扩容  前置知识:  二叉树:每个节点至多只有两个子节点的树  搜索二叉树:满足当前节点的左子树上的节点不能大于当前节点,右子树上的节点不能小于当前节点的二叉树  红黑树:一种自平衡的搜索二叉树,能保证遍历,插入,删除的时间复杂度永远是O(logn)  红......
  • 题解:P11063 【MX-X4-T3】「Jason-1」数对变换
    ProblemLink【MX-X4-T3】「Jason-1」数对变换题外话场上把贪心注重在一个奇怪地方了,导致交的时候已经有\(9\)个人\(\textcolor{green}{AC}\)了(哭)。题意简述对于数对\((x,y)\),你可以执行以下两种变换:类型1:取\(1\lek\lex\),令\((x,y)\gets(\lfloor\frac{x}{k}......
  • 洛谷P1373:小 a 和 uim 之大逃离
    洛谷P1373:小a和uim之大逃离题意略思路DP:记dp[i][j][c][0/1]表示走到\(i\)行\(j\)列时,两人容量之差为\(c\)的方案数,\(0\)表示\(\rm小a\)走的最后一步,\(1\)表示\(\rmuim\)走的最后一步。容易得出转移方程:dp[i][j][l][0]+=dp[i-1][j][l-a[i][j]+k][1];dp[......
  • 题解:P10370 「LAOI-4」Mex Tower (Hard ver.)
    ProblemLink「LAOI-4」MexTower(Hardver.)题意给定一个长度为$n$的序列$a$,求序列的$\operatorname{Mex}$值是否大于等于其他所有长度为$n$的自然数序列的$\operatorname{Mex}$值。Solution不难发现,两个数或一个序列的$\operatorname{Mex}$一定是......
  • [2024领航杯] Pwn方向题解 babyheap
      [2024领航杯]Pwn方向题解babyheap前言:当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事情,才开始看题目,XiDP师傅说是2.35版本的libc,确实高版本libc的却棘手,我经验太浅了调试半天,最后让我们......
  • 和TEN、CosyVoice、Rokid一起「组装」你的专属多模态 Agent!丨RTE2024 AI 工坊报名
       2024年10月25日~26日,由声网和RTE开发者社区联合主办的RTE2024第十届实时互联网大会将在北京·悠唐皇冠假日酒店正式开启! 大会以「AI爱」为主题,推出覆盖实时互联网全生态的论坛及周边活动共计20余场。 这次RTE开发者社区为大家准备了一场RTE2024......