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

2024/10/14 模拟赛总结

时间:2024-10-14 22:10:38浏览次数:7  
标签:10 14 int kMaxN 2024 ++ kP cnt2 cnt1

\(0+100+40+0=140\),怎么都会 T3 啊

#A. char

令 \(dp_{i,j}\) 为已经考虑了文本串前 \(i\) 位且将所有 * 填入了字符,匹配了模式串的前 \(j\) 位的方案总数

转移显然,若第 \(i\) 位不是 *,则只有这一位和模式串相等才会有答案,即 \(dp_{i,j}=\begin{cases}dp_{i-1,j-1} & s_i=t_k\\0 & \text{else}\end{cases}\)

否则当前位可以填任意字符,则 \(dp_{i,j}=\sum dp_{i-1,j}\)

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

using namespace std;
using LL = long long;

const int kMaxM = 1e3 + 5, kMaxN = 5e4 + 5;
const int kP = 998244853;

int n, m, sz[kMaxN];
LL dp[kMaxN][kMaxM], pre[kMaxN][kMaxM], ans;
string s, t[kMaxN];

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("char.in", "r", stdin), freopen("char.out", "w", stdout);
  cin >> n >> m >> s;
  for (int i = 1; i <= m; i++) {
    cin >> t[i], sz[i] = t[i].size();
    for (int j = 1; j <= n; j++) {
      fill(dp[j], dp[j] + sz[i] + 2, 0), fill(pre[j], pre[j] + sz[i] + 2, 0);
      if (s[j - 1] != '*') {
        for (int k = 1; k <= sz[i]; k++) {
          if (s[j - 1] == t[i][k - 1]) {
            (dp[j][k] += dp[j - 1][k - 1] + (k == 1)) %= kP;
          }
          pre[j][k] = pre[j][k - 1] + dp[j][k] % kP;
        }
      } else {
        dp[j][0] = dp[j - 1][0] + 1;
        for (int k = 1; k <= sz[i]; k++) {
          (dp[j][k] += (dp[j - 1][0] + pre[j - 1][k] + 1) % kP) %= kP;
          pre[j][k] = pre[j][k - 1] + dp[j][k] % kP;
        }
      }
    }
    for (int j = 1; j <= n; j++) {
      (ans += dp[j][sz[i]]) %= kP;
    }
  }
  cout << ans << '\n';
  return 0;
}

#B. tree

感觉很像原题啊找到原题了

引入那个 T2 的概念:影响域

由于最多改变一个颜色且 \(n \le 3000\),可以想到枚举修改的点

对于每条边,求出其左右两边的影响域,答案即为左边白点乘右边黑点加左边黑点乘右边白点,枚举修改的点,对于每条边修改影响域中黑白点的数量,直接计算比大小即可

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

using namespace std;
using LL = long long;

const int kMaxN = 3e3 + 5;

vector<pair<int, LL>> g[kMaxN];
int n, c[kMaxN], u[kMaxN], v[kMaxN];
LL ans = 1e18, calc, cnt1[2][kMaxN], cnt2[2][kMaxN], w[kMaxN];  // cnt1 : white   cnt2 : black
unordered_map<int, bool> mp[2][kMaxN];

void DFS(int u, int fa, LL lt, int ae, bool flag) {
  (c[u] == 0 ? cnt1[flag][ae] : cnt2[flag][ae])++, mp[flag][ae][u] = 1;
  for (pair<int, LL> i : g[u]) {
    int v = i.first;
    LL w = i.second;
    if (v != fa) {
      if (w < lt) {
        DFS(v, u, lt, ae, flag);
      }
    }
  }
}
LL Calc(int x, LL ret = calc) {
  for (int i = 1; i < n; i++) {
    if (mp[0][i].count(x)) {
      ret -= w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);
      (c[x] == 1) ? (cnt1[0][i]++, cnt2[0][i]--) : (cnt1[0][i]--, cnt2[0][i]++);
      ret += w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);
      (c[x] == 1) ? (cnt1[0][i]--, cnt2[0][i]++) : (cnt1[0][i]++, cnt2[0][i]--);
    } else if (mp[1][i].count(x)) {
      ret -= w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);
      (c[x] == 1) ? (cnt1[1][i]++, cnt2[1][i]--) : (cnt1[1][i]--, cnt2[1][i]++);
      ret += w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);
      (c[x] == 1) ? (cnt1[1][i]--, cnt2[1][i]++) : (cnt1[1][i]++, cnt2[1][i]--);
    }
  }
  return ret;
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  freopen("tree.in", "r", stdin), freopen("tree.out", "w", stdout);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> c[i];
  }
  for (int i = 1; i < n; i++) {
    cin >> u[i] >> v[i] >> w[i], g[u[i]].push_back({v[i], w[i]}), g[v[i]].push_back({u[i], w[i]});
  }
  for (int i = 1; i < n; i++) {
    DFS(u[i], v[i], w[i], i, 0), DFS(v[i], u[i], w[i], i, 1), calc += w[i] * (cnt1[0][i] * cnt2[1][i] + cnt1[1][i] * cnt2[0][i]);
  }
  ans = calc;
  for (int i = 1; i <= n; i++) {
    ans = max(ans, Calc(i));
  }
  cout << ans << '\n';
  return 0;
}

#C. wooden

考虑容斥,所有的情况为 \(\mathrm{C}_{\lceil\frac{x}{2}\rceil}^{3}\)

令选的长度为 \(x < u < v < w \le 4x\),那么不满足条件的条件为 \(x+u \le v \le w-u \le 4x-u\)

先想 \(O(n)\) 做法,我们枚举 \(u\),那么对于每一个 \(u\) 其他方案数为 \(\mathrm{C}_{3x-2u+1}^{2}\),把这些式子拆开裂项合并就可以求出最终的式子:\(n^3-\frac{\lceil\frac{x}{2}\rceil\times (\lceil\frac{x}{2}\rceil+1)\times(2\lceil\frac{x}{2}\rceil+1)}{6}+[n\bmod 2=0]\times \lceil\frac{x}{2}\rceil^2\)

按照式子直接算即可

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

using namespace std;
using LL = long long;

const LL kP = 1e9 + 7, iv = 166666668;

LL n, ans, cnt, in;

int main() {
  freopen("wooden.in", "r", stdin), freopen("wooden.out", "w", stdout);
  cin >> in, n = (in + 1) >> 1, n %= kP, ans = ((in * 3 % kP) * ((in * 3 % kP) - 1) % kP) * ((in * 3 % kP) - 2) % kP, (ans *= iv) %= kP;
  cnt = (((n % kP) * n % kP) * n % kP) - ((((n % kP) * ((n + 1) % kP) % kP) * ((n + n + 1) % kP) % kP) * iv % kP) % kP, (cnt += kP) %= kP;
  (in & 1 ^ 1) && ((cnt += (n % kP) * (n % kP) % kP) %= kP);
  cout << (((ans - cnt) % kP) + kP) % kP << '\n';
  return 0;
}

#D. stars

人机期望,以后再写

标签:10,14,int,kMaxN,2024,++,kP,cnt2,cnt1
From: https://www.cnblogs.com/bluemoon-blog/p/18466222

相关文章

  • 2024/10/14日 动手动脑
    1.关于继承中成员变量的访问特点代码示例:点击查看代码publicclassMain{publicstaticvoidmain(String[]args){Ziz=newZi();z.ziShow();}}classFu{Stringname="Fu";}classZiextendsFu{Stringname="Zi";p......
  • 代码随想录算法训练营day15| 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和
    学习资料:https://programmercarl.com/0110.平衡二叉树.html#算法公开课平衡二叉树:任意一个节点的左右子树高度差不超过1左叶子:是叶子节点,且是其父节点的左节点完全二叉树:上层均满,底层的节点从左到右连续满二叉树:每层都是满的,节点总数为(2^k+1)语法:2<<1是2^2学习记录:1......
  • Moectf2024-All-Crypto
    前三周都出了,第四周有两题不会,为复现Crypto入门指北fromCrypto.Util.numberimportbytes_to_long,getPrimefromsecretimportflagp=getPrime(128)q=getPrime(128)n=p*qe=65537m=bytes_to_long(flag)c=pow(m,e,n)print(f"n={n}")print(f"p={p......
  • 10月14日课程动手动脑
    1.此处出错是因为newfoo()中没有参数,编译器无法识别该方法。2其最终的值为200,首先我们应该明白其中的顺序,在对象实例化的时候1静态字段和静态初始化块(如果有的话,这个例子中没有静态字段或静态初始化块)。2实例字段和实例初始化块:在对象被创建时,实例字段和实例初始化块会按照......
  • 2024牛客暑期多校训练营4 - J. Zero (究极卡常)
    \(O(N^2)\)AC。输入后预处理?数量的前缀和。双层循环找所有的区间\([l,r]\)使区间内没有\(0\),找到以后直接用逆元+快速幂求\(\frac{(r-l+1)^k}{2^{sum_{r}-sum_{l-1}}}\),最后累加和。因为数据过水,这样已经能AC了。#include<cstdio>usingnamespacestd;constint......
  • Stanford CS149 -- Assignment 3: A Simple CUDA Renderer
    作业描述及代码参见:CS149-asst3实验环境:WSL2;GeForceMX350;Cuda12.6第一部分:CUDA热身练习1:SAXPY实验结果:相比基于CPU的实现,性能明显下降。这是由于SAXPY属于I/O密集型任务,计算量较小,主要的时间耗费在数据的转移。第二部分:CUDA热身练习2:并行前缀和第三部分:简单......
  • Stanford CS149 -- Assignment 4: NanoGPT149
    作业描述及代码参见:cs149gptWarm-Up:访问张量张量/数组都是按行存储的,四维数组可以看作元素为三维数组的数组,元素大小即为三维数组内元素总数,以此类推。第1部分:简单(但不太高效)的注意力机制实现主要实现两个矩阵乘法和一个softmax运算。第2部分:块矩阵乘法和UnfusedSof......
  • [NOI2014] 动物园——KMP 倍增
    [NOI2014]动物园题目描述近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。某天,园长给动物们讲解KMP算法。园长:“对于一个字符串\(S\),它......
  • Stanford CS149 -- Assignment 2: Building A Task Execution Library from the Groun
    作业描述及代码参见:CS149-asst2PartAStep1只需要实现一个简单的任务系统,在run()的开始生成工作线程,并在run()返回之前从主线程合并这些线程。任务的分配方式采用动态分配,即每个线程每次取一个任务完成,能者多劳。每个线程的核心实现为:while(true){inttaskID=done+......
  • 2024/10/14日工作总结
    完成数据结构作业,用栈和队列两种方法实现回文;栈的实现:includeusingnamespacestd;constexprautoMAXSIZE=50;typedefstruct{char*base;char*top;intstacksize;}sqStack;voidInitStack(sqStack&s){s.base=newchar[MAXSIZE];if(!s.base)exit(OVERFLOW)......