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

2024/10/02 模拟赛总结

时间:2024-10-02 19:22:15浏览次数:6  
标签:02 10 int kMaxN 2024 second long ans first

暴力挂惨了,\(0+0+5+0=5\)

#A. 躲避技能

评价:人机高精度

由于边权是正数,多走一条边一定更劣,所以能在子树内解决的就尽量不要出来

那么对于每一条边,它被遍历的次数是子树内起点与终点数量之差

直接枚举每一条边,算答案即可

人机高精度

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

using namespace std;
using LL = long long;

const int kL = 2e2 + 5, kMaxN = 1e5 + 5;

int n, m, s[kMaxN], f[kMaxN], e[kMaxN][kL], in[kL], ans[kMaxN], r;
string S;
vector<pair<int, int>> g[kMaxN];

void DFS(int u, int fa) {
  for (auto [v, i] : g[u]) {
    if (v != fa) {
      DFS(v, u), f[u] += f[v], f[v] = abs(f[v]);
      for (int j = 0; j <= 100; j++) {
        ans[j] += f[v] * e[i][j];
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("skill.in", "r", stdin), freopen("skill.out", "w", stdout);
  cin >> n >> m;
  for (int i = 1, x; i <= m; i++) {
    cin >> x, f[x]++;
  }
  for (int i = 1, x; i <= m; i++) {
    cin >> x, f[x]--;
  }
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v >> S, g[u].push_back({v, i}), g[v].push_back({u, i});
    for (int j = 0; j < S.size(); j++) {
      e[i][j] = S[j] - '0';
    }
  }
  DFS(1, 0);
  for (int i = 0; i < kL - 2; i++) {
    ans[i + 1] += ans[i] / 10, ans[i] %= 10;
  }
  for (int i = kL - 1; ~i; i--) {
    if (ans[i]) {
      r = i;
      break;
    }
  }
  for (int i = r; ~i; i--) {
    cout << ans[i];
  }
  cout << '\n';
  return 0;
}

#B. 奶茶兑换券

评价:人机双指针

都有无限张卷还管有没有浪费

列出两个值组合出来浪费的值:\((m-((a_i+a_j) \bmod m))\bmod m\),显然所有 \(a_i\) 都可以更新为 \(a_i\bmod m\)。当这个两个数都小于 \(\frac m2\) 时,浪费的钱是直接相加。都大于的时候浪费的钱是相加后减去 \(m\)

那么最后答案就是所有取模后的 \(a_i\) 相加后减去的几个 \(m\)。然后就是要尽量多的凑齐和大于 \(m\) 的数,双指针例题

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

using namespace std;
using LL = long long;
using Pll = pair<LL, LL>;

const int kMaxN = 1e5 + 5;

int n, m;
LL ans, l, r;
Pll a[kMaxN];

int main() {
  freopen("tea.in", "r", stdin), freopen("tea.out", "w", stdout);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].first >> a[i].second, a[i].second %= m;
    if (!a[i].second) {
      n--, i--;
      continue;
    }
    ans += a[i].first * (m - a[i].second);
  }
  sort(a + 1, a + n + 1, [](Pll l, Pll r) { return l.second < r.second; }), l = 1, r = n;
  for (; l < r;) {
    for (; a[l].second + a[r].second > m; r--) {
    }
    LL k = min(a[l].first, a[r].first);
    a[l].first -= k, a[r].first -= k, ans -= k * m;
    (a[l].first == 0) && (l++), (a[r].first == 0) && (r--);
  }
  (a[l].second * 2 < m) && (ans -= a[l].first / 2 * m);
  cout << ans << '\n';
  return 0;
}

#C. 帮助

评价:人机二分

令 \(g_{i,j}\) 表示成绩为 \(j\) 且愿意帮助成绩为 \(i\) 的人所做题目数量之和

递推式为 \(g_{i,j}=g_{i-1,j}\displaystyle\sum_{c_p=i\cap t_p=j}f_p-\displaystyle\sum_{d_p=i-1\cap t_p=j} f_p\)

所以我们排序然后离散化,找到上式的两个断点,用 fenwick tree 维护并递推 \(g\) 值即可

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

using namespace std;
using LL = long long;
#define int long long

const int kMaxN = 1e5 + 5;

struct P {
  LL a[5], e, f, id, l, r;
  bool operator<(const P &o) const {
    return f < o.f;
  }
};
struct T {
  int tot, c[kMaxN << 3];
  int L(int x) { return x & -x; }
  void Update(int x, LL k) {
    for (; x <= tot + 1; c[x] += k, x += L(x)) {
    }
  }
  LL Query(int x, LL ret = 0) {
    for (; x; ret += c[x], x -= L(x)) {
    }
    return ret;
  }
};

int n;
LL u[kMaxN << 3], c[kMaxN];
vector<int> L[kMaxN], R[kMaxN];
T tr;
P w[kMaxN];

signed main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("help.in", "r", stdin), freopen("help.out", "w", stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> w[i].e;
  }
  for (int i = 1; i <= n; i++) {
    cin >> w[i].f, w[i].id = i, u[5 * i] = w[i].f;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= 4; j++) {
      cin >> w[i].a[j];
      u[5 * i - j] = w[i].a[j];
    }
  }
  sort(u + 1, u + 5 * n + 1), tr.tot = unique(u + 1, u + 5 * n + 1) - u - 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= 4; j++) {
      w[i].a[j] = lower_bound(u + 1, u + tr.tot + 1, w[i].a[j]) - u;
    }
    w[i].f = lower_bound(u + 1, u + tr.tot + 1, w[i].f) - u;
  }
  sort(w + 1, w + n + 1);
  for (int i = 1; i <= n; i++) {
    L[lower_bound(w + 1, w + n + 1, (P){{0, 0, 0, 0, 0}, 0, w[i].a[1], 0, 0, 0}) - w - 1].push_back(i);
    R[upper_bound(w + 1, w + n + 1, (P){{0, 0, 0, 0, 0}, 0, w[i].a[2], 0, 0, 0}) - w - 1].push_back(i);
  }
  for (int i = 0; i <= n; i++) {
    for (LL j : L[i]) {
      w[j].l = tr.Query(w[j].f);
    }
    for (int j : R[i]) {
      w[j].r = tr.Query(w[j].f);
    }
    (i != n) && (tr.Update(w[i + 1].a[3], w[i + 1].e), tr.Update(w[i + 1].a[4] + 1, -w[i + 1].e), 0);
  }
  for (int i = 1; i <= n; i++) {
    c[w[i].id] = w[i].r - w[i].l;
    if (w[i].f < w[i].a[1] || w[i].f > w[i].a[2] || w[i].f < w[i].a[3] || w[i].f > w[i].a[4]) {
      c[w[i].id] += w[i].e;
    }
  }
  for (int i = 1; i <= n; i++) {
    cout << c[i] << ' ';
  }
  cout << '\n';
  return 0;
}

#D. 神奇的变换

评价:人机数论分块

std 写的比 poker 还长,先咕咕咕

标签:02,10,int,kMaxN,2024,second,long,ans,first
From: https://www.cnblogs.com/bluemoon-blog/p/18444975

相关文章

  • 【LGR-197-Div.2】洛谷 10 月月赛 I &「SFMOI」Round I(A,B,C)
    A.StrangeCakeGame对于小W,往下走最赚,对于小M往右走最赚,于是路线形成了个折线,直接对应竖坐标位置去看看横坐标符不符合要求即可#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<deque>#include<math.h>#include<m......
  • 2024新生赛-Week1
    F12快捷键f12直接查看字符串xor了解一下XOR运算,AB=C,CA=B使用a数组对输入的字符进行循环运算取出最终的字符串再进行一次xor即可得到flagEzencode进入加密函数后发现是一个base64算法,对表进行了替换,最后有对编码得到的结果进行异或操作.提出最后的密文,进行异或,换表......
  • 2024 ICPC Online 第二场(K)
    #pragmaGCCoptimize("O3,unroll-loops")//#pragmaGCCtarget("avx2,bmi,bmi2,lzcnt,popcnt")//如果在不支持avx2的平台上将avx2换成avx或SSE之一#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int......
  • 【牛客训练记录】2024牛客国庆集训派对day2
    赛后反思只开出来两题,好像水平就这样了TATI题给定一个排列,对于每项可以选择+1或者不加,求逆序对对数最小我们可以思考一下什么情况下可以减少最后答案的逆序对,对于\([4,3]\)或者\([2,1]\)这种情况,将第二个元素+1才能对答案的减少做出贡献,所以只要判断某一位的后面是否有那......
  • zlibrary 最新官方国内可用网址入口及电脑客户端集合(2024持续更新)
    Z-library,被誉为全球范围内最为庞大的数字图书馆之一,其藏书量之丰富令人叹为观止,总计囊括了超过9,826,996册电子书及84,837,646篇学术期刊文章。这座庞大的知识宝库覆盖了从经典文学巨著到前沿理工学科,从人文艺术瑰宝到专业学术论文的广泛领域,几乎能够满足每一位求知者的阅读与学......
  • 题解:SP7973 ACPC10E - Sometimes, a penalty is good!
    比较简单的一道数学题。思路:计算小组赛的比赛总数。longlongstage1=G*T*(T-1)/2;每组有\(T\)个队伍,每个队伍都需要与其他\(T-1\)个队伍比赛,共有\(T\cdot(T-1)\)场比赛。共有\(G\)组,因此小组赛总比赛数为\(\frac{G\cdotT\cdot(T-1)}{2}\)。计算进入......
  • 题解:SP10242 ACPC11D - Dice on a Board
    思路递归生成所有的可能的筛子朝向,用DFS标记所有可达的位置,用dijkstra计算从起始位置到目标位置的最优路径,并确定在移动过程中能够获得的最大分数。generate函数generate用于生成所有可能的骰子朝向排列,\(mask\)作为参数,用于表示哪些数字已经被使用。使用二进制压缩。......
  • 题解:P9788 [ROIR 2020 Day2] 区域规划
    法1枚举\(a,b,c\),考虑到\(c\)的最小值为\(\max(1,\frac{(a\cdotb−n)}{b})\),所以直接剪枝即可通过。代码:#include<bits/stdc++.h>usingnamespacestd;intans,n,m;intmain(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(i......
  • 10 - 2 ~ 10 - 3 模拟赛报告
    启动新赛季!10.2题目一览:题目名称躲避技能奶茶兑换券帮助神奇的变换题目类型传统传统传统传统文件名skillteahelpchange时空限制\(2s256M\)\(1s256M\)\(2s256M\)\(5s256M\)测试点数量\(25\)\(10\)\(20\)\(25\)请观看VCR,并回答作者表......
  • win11,vc22源码编译opencv410
    1.安装cmake 2.配代理,否则无法下载依赖包3.自行编译OpenCV源码步骤4.注意配置系统变量,重启机器https://blog.csdn.net/weixin_50648158/article/details/139742826亲测可用OpenCV4.10.0在Windows10,64位,vs2022下的编译及配置方法https://blog.csdn.net/yxfamyself/article......