首页 > 其他分享 >2024/09/30 模拟赛总结

2024/09/30 模拟赛总结

时间:2024-10-01 22:00:55浏览次数:8  
标签:tmp sz 30 int 09 cin kMaxN 2024 ans

\(0+0+42+40\),T1在写正解的时候突然比赛还有1分钟结束,然后把 freopen 注释的暴力在最后几秒交了上去

#A. 博弈

唐氏 xor-hashing,首先博弈游戏很简单,如果有一个数的出现次数是奇数则先手必胜,否则先手必败

那么先手必败的条件就是路径上所有边权都是两两配对的,即异或和为 \(0\)。那么钦定点 \(1\) 为根,求出它到每个点的异或和,用 map 存下每个和的出现次数。答案为 \({n \choose 2} - \sum {\text{mp}_i \choose 2}\)

因为边权太小,异或可能会挂掉,所以需要随机一个较大值来异或防止错误

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

using namespace std;
using LL = long long;

const int kMaxN = 5e5 + 5;

LL cnt, s[kMaxN];
vector<pair<int, LL>> g[kMaxN];
int t, n;
map<LL, LL> h, ans;
mt19937_64 rd(time(0) + 3247 + 1508);

void DFS(int u, int fa) {
  ans[s[u]]++;
  for (auto [v, w] : g[u]) {
    if (v != fa) {
      s[v] = s[u] ^ h[w], DFS(v, u);
    }
  }
}

int main() {
  freopen("game.in", "r", stdin), freopen("game.out", "w", stdout);
  for (cin >> t; t; t--, ans.clear()) {
    cin >> n;
    for (int i = 1, u, v, w; i < n; i++) {
      cin >> u >> v >> w, g[u].push_back({v, w}), g[v].push_back({u, w}), (!h[w]) && (h[w] = rd());
    }
    s[1] = 0, DFS(1, 0), cnt = 1ll * n * (n - 1) / 2;
    for (auto [u, v] : ans) {
      cnt -= v * (v - 1) / 2;
    }
    cout << cnt << '\n';
    for (int i = 1; i <= n; i++) {
      g[i].clear();
    }
  }
  return 0;
}

#B. 跳跃

显然跳跃形式一定是形如 \(l_1 \rightarrow r_1 \rightarrow l_1 \dots l_1 \rightarrow r_2 \rightarrow l_2 \rightarrow r_2 \rightarrow l_2 \rightarrow r_3 \dots r_m \rightarrow l_m\),其中 \(l_i \le r_1 \le l_2 \le r_2 \le \dots \le l_m \le r_m\)

令 \(dp_i\) 为跳到 \(i\),最小跳跃次数以及分数。然后枚举上一个段来直接大力转移即可

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

using namespace std;
using LL = long long;

const int kMaxN = 1e3 + 5;

LL t, n, k, a[kMaxN << 1], s[kMaxN << 1], mx[kMaxN << 1], ans, e[kMaxN << 1], vis[kMaxN << 1], g[kMaxN << 1];
queue<LL> q;

LL Calc(LL x, LL y) { return s[max((x - 1) % n + 1, (y - 1) % n + 1)] - s[min((x - 1) % n + 1, (y - 1) % n + 1) - 1]; }

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("jump.in", "r", stdin), freopen("jump.out", "w", stdout);
  for (cin >> t; t; t--, ans = 0) {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
      cin >> a[i], s[i] = s[i - 1] + a[i];
    }
    fill(mx + 1, mx + 2 * n + 1, -1e18), fill(e + 1, e + 2 * n + 1, 1e18), fill(vis + 1, vis + 2 * n + 1, 0), fill(g + 1, g + 2 * n + 1, -1e18);
    for (int i = 1; i <= n; i++) {
      for (int j = i; j <= n; j++) {
        mx[i] = max(mx[i], (s[j] - s[i - 1]) << 1), mx[j + n] = max(mx[j + n], (s[j] - s[i - 1]) << 1);
      }
    }
    for (e[1] = g[1] = 0, q.push(1); !q.empty();) {
      LL u = q.front();
      q.pop(), vis[u]++;
      if (vis[u] == (n << 1 | 1)) {
        continue;
      }
      for (int i = 1; i <= n << 1; i++) {
        if ((u <= n && i >= u + n) || (i <= n && u >= i + n)) {
          LL v = e[u], w = g[u], tmp = Calc(i, u);
          if (w + tmp < 0 && mx[u] <= 0) {
            continue;
          }
          if (w + tmp < 0) {
            LL p = (mx[u] - 1 - w - tmp) / mx[u];
            v += p << 1, w += p * mx[u];
          }
          w += tmp, v++;
          if (v < e[i] || v == e[i] && w > g[i]) {
            e[i] = v, g[i] = w, q.push(i);
          }
        }
      }
    }
    for (int i = 1; i <= n << 1; i++) {
      if (e[i] <= k) {
        ans = max({ans, g[i], (k - e[i]) / 2 * mx[i]});
        if (e[i] != k) {
          for (int j = 1; j <= n << 1; j++) {
            LL tmp = Calc(i, j);
            (tmp >= 0) && (ans = max(ans, g[i] + (k - 1 - e[i]) / 2 * mx[i] + tmp));
          }
        }
      }
    }
    cout << ans << '\n';
  }
  return 0;
}

#C. 大陆

原题

纯人类智慧,进行一遍 DFS 所当前子树节点数量大于 \(B\),则直接割开。最后剩下遗留的子树合起来一定小于 \(3B\),之久分为一组即可

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

using namespace std;

const int kMaxN = 1e4 + 5;

int n, b, tot, ans[kMaxN], sz[kMaxN], m[kMaxN];
vector<int> g[kMaxN], s[kMaxN];

void DFS(int u, int fa) {
  for (int v : g[u]) {
    if (v != fa) {
      DFS(v, u), sz[u] += sz[v], (s[u].size() < s[v].size()) && (swap(s[u], s[v]), 0);
      for (int tmp : s[v]) {
        s[u].push_back(tmp);
      }
      if (sz[u] >= b) {
        m[++tot] = u;
        for (int tmp : s[u]) {
          ans[tmp] = tot;
        }
        s[u].clear(), sz[u] = 0;
      }
    }
  }
  sz[u]++, s[u].push_back(u);
  if (sz[u] >= b) {
    m[++tot] = u;
    for (int tmp : s[u]) {
      ans[tmp] = tot;
    }
    s[u].clear(), sz[u] = 0;
  }
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("mainland.in", "r", stdin), freopen("mainland.out", "w", stdout);
  cin >> n >> b;
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v, g[u].push_back(v), g[v].push_back(u);
  }
  DFS(1, 0);
  for (int tmp : s[1]) {
    ans[tmp] = tot;
  }
  cout << tot << '\n';
  for (int i = 1; i <= n; i++) {
    cout << (ans[i] ? ans[i] : tot) << " \n"[i == n];
  }
  for (int i = 1; i <= tot; i++) {
    cout << m[i] << " \n"[i == tot];
  }
  return 0;
}

#D. 排列

要写 FHQ,理解思路但懒得写,先咕咕咕

标签:tmp,sz,30,int,09,cin,kMaxN,2024,ans
From: https://www.cnblogs.com/bluemoon-blog/p/18443568

相关文章

  • 2024.10.1 总结(集训;数据结构 主要是线段树)
    XK又来给我们讲课了。开心!1.Baka'sTrick两种理解:双栈模拟队列。[找到若干个划分点,使得每个区间包含恰好一个划分点。维护划分点到划分点段的前缀、后缀信息。在在线的实现中,在队列中维护仅仅一个划分点,维护它到前面每个点和它到后面每个点的信息。当这个划分点出队时,把队......
  • [20240930]关于共享池-表对象在库缓存探究2.txt
    [20240930]关于共享池-表对象在库缓存探究2.txt--//以前探究过sql语句在共享池存在父子游标,父游标存在堆0,子游标堆0,堆6,通过各种指针链接起来,--//父游标的堆0上保存了所有子游标的列表和各个子游标的句柄指针,子游标的堆6中保存了解析过的执行计划等解析信息。--//前几天测试表对象......
  • 2024/09/29 模拟赛总结
    \(0+0+0+0=0\),感觉不如#include<bits./stdc++.h>#A.你相信()吗\(70\)分的\(O(n^3)\)算法很好解决,枚举出三盏灯的亮度后,剩下一个灯的亮度一定固定。对于每个格子剩余亮度需求取max即可。然后我们充分发扬人类智慧,当\(n\le400\)时跑暴力,否则考虑推式子,下面的\(=\)表......
  • 【牛客训练记录】2024牛客国庆集训派对day1
    https://ac.nowcoder.com/acm/contest/90188#question赛后反思好像没有,全场只做出来一题QAQJ题想在图上找到同色三角形,我们枚举至少是\(O(n^3)\)的,所以我们考虑容斥定理(?),去找异色三角形,因为只要保证一条边上两点颜色不一样,另找一点随便都可以,所以我们只要统计白色的点数,......
  • 当一群人聚在 RTE Open Day 现场|S 创上海 2024 回顾
       散场以后 9月20和21日的上海,RTE开发者社区正在主持第四期RTEOpenDay。这里有两场台风暴雨,和一群并没有因此降低半分热情的RTEbuilders! 这次我们把为实时互动领域的开发者们搭建的线下交流场,放在了一个年轻、多元、活力十足的科技聚会——S创上海202......
  • COMP3230 Principles of Operating Systems
    COMP3230PrinciplesofOperatingSystemsProgrammingAssignmentOneDuedate:Oct.17,2024,at23:59Total13points–ReleaseCandidateVersion2ProgrammingExercise–ImplementaLLMChatbotInterfaceObjectivesAnassessmenttaskrelatedto......
  • 2024.09 做题记录
    20240901上午模拟赛能想出来T2,但是怎么没想出来呢。T2:及时去想\(2^{k/2}\)的做法,猜到是DP套DP,但是没有进一步思考内层状态是\(O(2^{k/2}k)\)的。T3:没调完/fn/fnT4:赛时会了\(f_{i,j}\)表示\(B(i,j)\)是否可行,但是么有去想进一步的单调性优化,\(f_{i}\)可以表示最......
  • CSP2024-30
    A题意:将一个圆等分为\(K\)分,给出其中\(n\)个等分点的编号,\(x_i<x_{i+1}\)。有向边\(i\toj\)存在,当且仅当\(j\)是距离\(i\)最大的点(不唯一),且与图中其他边无交点(端点不算)。求图中最多有多少条边。\(3\leK\le10^9,3\len\le\min(K,10^5)\)。引理:不存在......
  • The 2024 ICPC Asia East Continent Online Contest (II)
    A.GamblingonChoosingRegionals最差情况就是,强队都和你去一起。因此赛站越小,排名也一定越小。然后只要动态实现出每个学校最强的若干只队伍就好了。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64using......
  • 2024 北京市大学生程序设计竞赛
    Preface北京市赛(×),小WF(确信)感觉这场题总体都挺难的,除了前1h出了两个题后,后面基本上都是1h出一题然后最后1h发生了经典的我和徐神B,F双开双会,最后开始抢机时,最后经典的一个没写出来赛后发现F赛时代码改个初值就能过了,而徐神多花了半小时也是成功把B过了只能说还......