首页 > 其他分享 >「题解」Educational Codeforces Round 170 (Rated for Div. 2)

「题解」Educational Codeforces Round 170 (Rated for Div. 2)

时间:2024-10-15 15:32:03浏览次数:1  
标签:std Educational Rated int 题解 typedef long while now

before

我不想写作业呜呜。

A. Two Screens

Problem

A. Two Screens

Sol&Code

理解题意后发现使用复制的方法完成最长公共前缀即可。

#include <bits/stdc++.h>

typedef long long ll;
typedef std::pair<int, int> pii;

int T;
std::string s1, s2;

int main() {
  scanf("%d", &T);
  while (T--) {
    std::cin >> s1 >> s2;
    int l1 = s1.length(), l2 = s2.length();
    int now = 0;
    while (now < l1 && now < l2 && s1[now] == s2[now]) ++now;
    if (now) printf("%d\n", now + 1 + l1 - now + l2 - now);
    else printf("%d\n", l1 + l2);
  }
  return 0;
}

B. Binomial Coefficients, Kind Of

Problem

B. Binomial Coefficients, Kind Of

Sol&Code

手推一部分数据不难发现答案是 \(2\) 的幂次。

#include <bits/stdc++.h>
#define N 100001

typedef long long ll;
typedef std::pair<int, int> pii;

int T, n[N], k[N];
const int mod = 1000000007;

int qpow(int a, int b) {
  int ans = 1, base = a;
  while (b) {
    if (b & 1) ans = 1ll * ans * base % mod;
    base = 1ll * base * base % mod;
    b >>= 1;
  }
  return ans % mod;
}

int main() {
  scanf("%d", &T);
  for (int i = 1; i <= T; ++i) scanf("%d", &n[i]);
  for (int i = 1; i <= T; ++i) scanf("%d", &k[i]);
  for (int i = 1; i <= T; ++i) {
    if (k[i] == 0 || k[i] == n[i]) puts("1");
    else printf("%d\n", qpow(2, k[i]));
  }
  return 0;
}

C. New Game

Problem

C. New Game

Sol&Code

双指针维护一下从某个数字开始最多能到哪,注意之间有多少不同的数即可。

#include <bits/stdc++.h>
#define N 200001

typedef long long ll;
typedef std::pair<int, int> pii;

int T, n, k, a[N];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    std::sort(a + 1, a + n + 1);
    int l = 1, r = 1, ans = 1, cnt_ = 1;
    while (r < n) {
      while (r < n && (a[r + 1] == a[r] || (a[r + 1] == a[r] + 1 && cnt_ < k)) ) {
        if (a[r + 1] == a[r]) ++r;
        else ++r, ++cnt_;
      }
      ans = std::max(ans, r - l + 1);
      if (r < n && a[r + 1] - a[r] > 1) ++r, l = r, cnt_ = 1;
      else {
        int gl = l;
        while (gl < n && a[gl] == a[l]) ++gl;
        l = gl, --cnt_;
      }
    }
    printf("%d\n", ans);
  }
  return 0;
}

D. Attribute Checks

Problem

D. Attribute Checks

Sol&Code

设 \(f_{i,j}\) 前 \(i\) 个技能点,智力用了 \(j\) 个,最多能通过到 \(i + 1\) 个技能点之前的几个测试。

转移,f[i][j] = max(f[i][j], max(f[i - 1][j], f[i - 1][j - 1]) + ad),其中 ad 是 \(j\) 点智力, \(i - j\) 点力量能通过的第 \(i\) 个技能点和第 \(i + 1\) 个技能点之间的测试的数量。

#include <bits/stdc++.h>

#define N 5001
#define M 2000002
#define lowbit(x) ((x) & (-x))

typedef long long ll;
typedef std::pair<int, int> pii;

int n, m, a[M], f[N][N];
struct BIT {
  int a[5001];
  void add(int x, int k) {
    while (x <= m) a[x] += k, x += lowbit(x);
  }
  int query(int x, int res = 0) {
    if (x < 0) return res;
    while (x > 0) res += a[x], x -= lowbit(x);
    return res;
  }
}b1, b2;

int main() {
  f[0][0] = 0;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  int lst = 0, now = 0, cnt = 1, ans = 0;
  while (a[now + 1] != 0) ++now;
  ++now, lst = now;
  while (now <= n) {
    while (now <= n && a[now + 1] != 0) ++now;
    if (a[now + 1] == 0) {
      // std::cout << lst << " " << now << '\n';
      for (int i = lst + 1; i <= now; ++i) {
        if (a[i] > 0) b1.add(a[i], 1);
        else b2.add(-a[i], 1);
      }
      for (int i = 0; i <= cnt; ++i) {
        int a1 = b1.query(i), a2 = b2.query(cnt - i);
        f[cnt][i] = std::max(f[cnt][i], std::max(f[cnt - 1][i - 1], f[cnt - 1][i]) + a1 + a2);
        // std::cout <<a1 << " " << a2 << " " << cnt << " " << i << " " << f[cnt][i] << '\n';
      }
      for (int i = lst + 1; i <= now; ++i) {
        if (a[i] > 0) b1.add(a[i], -1);
        else b2.add(-a[i], -1);
      }
      ++now, lst = now, ++cnt;
    }
  }
  for (int i = 0; i <= m; ++i) ans = std::max(ans, f[m][i]);
  printf("%d\n", ans);
  return 0;
}

/*
9 3
0 0 1 0 2 -3 -2 -2 1
*/

After

唉唉。。

好多作业。

不想上课。。

好久没打 cf 了,好多笨蛋错误,初始值错了两发,数组开小了一发。我是笨蛋。

C 和 D 写了好久,感觉不会写代码了。

标签:std,Educational,Rated,int,题解,typedef,long,while,now
From: https://www.cnblogs.com/poi-bolg-poi/p/18467609

相关文章

  • CF1955G GCD on a grid 题解
    洛谷链接我们暴力枚举可能的答案\(k\),然后跑一边dp。设\(f_{i,j}\)表示在格子\((i,j)\)是否可以满足有一条路径可以到达该格子且该格子是否为\(k\)的倍数,递推式即为\(f_{i,j}=(k\mida_{i,j}\operatorname{and}(f_{i-1,j}\operatorname{or}f_{i,j-1}))\)最后的答......
  • Educational Codeforces Round 170 (Rated for Div. 2) D.Attribute Checks (没有完全
    算法显然为dp状态设计\(dp_{i,j}\)表示在第\(i\)个获得能力点的地方,之前智慧能力值为\(j\),时的最大分数状态转移显然需要从\(dp_{i-1,j}\)转移而来枚举\(j\in[0,i)\)则有(注意取\(\max\)操作要与自己相比较)设第\(i-1\)个能力点到第\(i\)个能......
  • ARC156C 题解
    blog。显然答案为\(0\)不行。打表发现最优答案总为\(1\)。考虑构造取到\(1\)的下界。观察到,\(\text{LCS}\le1\)等价于去掉两序列都不存在的数后,两序列完全相反。于是有:在\(\{x\},\{y\}\)后增加两序列都不存在的数,不影响LCS。进行\(\{x\}\to\{a,x,b\},\{y\}\to\{b,......
  • # Educational Codeforces Round 170 (Rated for Div. 2) 题解D
    EducationalCodeforcesRound170(RatedforDiv.2)题解DD.AttributeChecks链接:Problem-D-Codeforces思路:由于\(m\)还有\(abs(r[i])\)很小,考虑dp因为每个0能对后面多少个check做出贡献是固定的,所以预处理因为我们每次的0的个数是单调不减的所以,我们上一次......
  • Educational Codeforces Round 170 (Rated for Div. 2) C. New Games
    题意转化找一些相邻的数(其中相邻定义为递增序下任意相邻两数差\(\leq1\))求相邻数中,不同数字有\(k\)种,取到数字个数的最大值算法容易想到按顺序排列观察到有点像滑动窗口,考虑用队列维护一个出现不同数字次数为\(k\)的区间,再计算代码来自转载地址voidsolv......
  • Codeforces Educational Codeforces Round 170 (Rated for Div. 2)
    A-TwoScreens大意:    给两个字符串,每次在两个空子符串进行两种操作     1、字符串末尾加一个任意字母    2、一个字符串全部复制给另一个字符串    求得到给定的两个字符串的最小操作数思路:    看最前面有多少相等即可 ......
  • Educational Codeforces Round 170 (Rated for Div. 2)
    目录写在前面A签到B结论C双指针D模拟,差分,DP,结论E计数,DP,F写在最后写在前面比赛地址:https://codeforces.com/contest/2025。妈的不想上学省赛回来昏了一天了。A签到发现最优的操作是先在一个屏幕操作得到最长公共前缀,然后复制到另一方上,再分别操作两方。特判若无公共前......
  • 【题解】P3917 异或序列
    传送门也算是一个有关于异或的小trick吧,简单记录一下。可以维护原序列的前缀异或和\(sum\),于是原题答案贡献变为\(\sum\limits_{i=1}^n\sum\limits_{j=i}^nsum_j\oplussum_{i-1}\)。变形一下为\(\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i+1}sum_i\oplussum_{j}......
  • [TJOI2019] 甲苯先生的字符串 题解
    T2[TJOI2019]甲苯先生的字符串矩阵乘法优化DP,所以一般来说这种DP都不怎么难。30pts的DP是裸的:设\(f_{i,j}\)为前\(i\)位、最后一位是\(j\)的方案数,则有转移方程:\[f_{i,j}=\sum_{k=0}^{25}f_{i-1,k}\landk\nej\]想要矩阵优化,我们想到构造答案矩阵:\[\mathit{an......
  • [PA2021] Od deski do deski 题解
    T1[PA2021]Oddeskidodeski发现合法的字符串一定是类似\(\texttt{aa...aabb...bbcc...cc}\)的形式,也就是若干个\(\texttta\)、若干个\(\textttb\) 和若干个\(\textttc\) 等组成的形式。如果当前选好的串\(S_1\)是合法的,且有另一个合法的串\(S_2\),那么显然\(S_1......