首页 > 其他分享 >「题解」Codeforces Round 979 (Div. 2)

「题解」Codeforces Round 979 (Div. 2)

时间:2024-10-21 14:10:20浏览次数:7  
标签:typedef int 题解 scanf Codeforces -- && cnt Div

before

\(A \sim D\) 的题解

A. A Gift From Orangutan

Problem

A. A Gift From Orangutan

Sol&Code

\(c_i - b_i\) 最大就是 \(a\) 的最大值减最小值。将 \(a\) 的最大值 \(x\) 和最小值 \(y\) 放到头两位即可得到答案 \((x - y)(n - 1)\)。

#include <bits/stdc++.h>

#define M 10001
#define N 100001

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

int T, n, a[N];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    std::sort(a + 1, a + n + 1);
    printf("%lld\n", 1ll * (a[n] - a[1]) * (n - 1));
  }
  return 0;
}

B. Minimise Oneness

Problem

B. Minimise Oneness

Sol&Code

\(f(t)\) 的值等于 \(t\) 中零的个数。可以构造 \(t\) 开头仅一位 \(1\) 其余位都为 \(0\),\(1\) 增多或者 \(0\) 在 \(1\) 两侧的话 \(g(t)\) 增长比较快。

#include <bits/stdc++.h>

#define M 10001
#define N 100001

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

int T, n;

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    if (n == 1) puts("0");
    else {
      putchar('1');
      for (int i = 1; i < n; ++i) putchar('0');
      puts("");
    }
  }
  return 0;
}

C. A TRUE Battle

Problem

C. A TRUE Battle

Sol&Code

手玩几组数据发现当且仅当两头至少有一个 \(1\) 或者有两个 \(1\) 相邻会得到 True

#include <bits/stdc++.h>

int T, n;
std::string s;

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    std::cin >> s;
    bool okay = false;
    if (s[0] == '1' || s[n - 1] == '1') { puts("YES"); continue; }
    for (int i = 0; i < n - 1; ++i) {
      if (s[i] == '1' && s[i + 1] == s[i]) { okay = true; break; }
    }
    puts(okay ? "YES" : "NO");
  }
  return 0;
}

D. QED's Favorite Permutation

Problem

D. QED's Favorite Permutation

Sol&Code

考虑题目限制发现,LR 这样的段使得 L 以左的数不能到达 R 以右,R 以右的数不能到达 L 以左。

考虑到是 L 还是 R 是在变化的,则考虑不变的数字。

对于不在正确位置的数字,将其交换过程中需要经过的区间做一下标记。全部标记完后查看被标记的隔断 LR 的数量有多少。在后续的变化中维护这个数量。标记可以使用差分。注意变化中维护的细节。

#include <bits/stdc++.h>

#define M 10001
#define N 200002

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

std::string s;
int T, n, q, a[N], b[N];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &n, &q);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    std::cin >> s;
    for (int i = 1; i <= n; ++i) b[i] = 0;
    for (int i = 1; i <= n; ++i) {
      if (a[i] != i) {
        if (i < a[i]) ++b[i], --b[a[i]];
        else ++b[a[i]], --b[i];
      }
    }
    for (int i = 1; i <= n; ++i) b[i] = b[i - 1] + b[i];
    int cnt = 0;
    for (int i = 0; i < n - 1; ++i) {
      if (s[i] == 'L' && s[i + 1] == 'R' && b[i + 1] > 0) ++cnt;
    }
    for (int i = 1, x; i <= q; ++i) {
      scanf("%d", &x);
      if (x == n) continue;
      if (s[x - 1] == 'L') {
        if (s[x] == 'R' && b[x] > 0) --cnt;
        s[x - 1] = 'R';
        if (x - 2 >= 0 && s[x - 2] == 'L' && b[x - 1] > 0) ++cnt;
      } else if (s[x - 1] == 'R') {
        if (s[x] == 'R' && b[x] > 0) ++cnt;
        s[x - 1] = 'L';
        if (x - 2 >= 0 && s[x - 2] == 'L' && b[x - 1] > 0) --cnt;
      }
      if (cnt == 0) puts("YES");
      else puts("NO");
    }
  }
  return 0;
}

After

  • D 从不变的方向思考可能比较简单。

D 写的太着急了,虽然方法大体正确但是细节上出了好多错 XD。

标签:typedef,int,题解,scanf,Codeforces,--,&&,cnt,Div
From: https://www.cnblogs.com/poi-bolg-poi/p/18489374

相关文章

  • Codeforces Round 980 (Div. 2) C. Concatenation of Arrays
    题目:给定n个数组a1,a2,…,an。每个数组的长度都是2。因此,ai=[ai,1,ai,2]。你需要将这些数组连接成一个长度为2n的单一数组,以便使结果数组中的逆序数最小。注意,你不需要实际计算逆序的数量。更正式地说,你需要选择一个长度为n的排列p,使得数组b=[ap1,1,ap1,2,......
  • CF round 979 div2(D-E)
    D容易观察到需要连续一段区间。这不单点修改区间查询,然后我思维就开始往线段树飘了。。。并且我到这里就以为做完了开始想实现,实际上性质都没观察准确。。但是因为这是一个1500的题所以显然有不用线段树的解。题解是差分做的,确实差分也可以操作区间观察到“LR”一定是隔断点,那......
  • AT_abc348_d [ABC348D] Medicines on Grid 题解
    题目传送门题目大意:给定一个\(n\timesm\)的地图,要求从起点S走到终点T,每移动\(1\)个会消耗\(1\)点能量,障碍#不能走,空地为.可以走,体力消耗至\(0\)也无法移动,地图位置\((x_i,y_i)\)有一瓶可以变成\(e_i\)体力的药,可以选择是否喝。问能否抵达终点,可以输出Yes,否......
  • AT_abc374_e [ABC374E] Sensor Optimization Dilemma 2 题解
    洛谷题目传送门AT题目传送门题目大意:给定\(n\)道工序,你有\(X\)元的资金,对于第\(i\)道工序,有两种机器供你选择,第一种机器可以花费\(P_i\)元处理\(A_i\)个产品,第二种机器可以花费\(Q_i\)元处理\(B_i\)个产品。钦定第\(i\)天处理的产品个数为\(W_i\),求在总花费......
  • UVA11294 Wedding 题解
    洛谷题目传送门前排提示:本题需要用到知识点2-SAT以及强联通分量,模板传送门P4782【模板】2-SAT。题目大意:有至多\(30\)对夫妻将会参加一个婚宴。他们将会坐在一个长桌子的两边。新郎新娘坐在彼此相对的一端并且新娘带着一个头饰使得她看不到和她坐在同一边的人。夫妻坐在......
  • SP9685 ZTC - Zombie’s Treasure Chest 题解
    洛谷题目传送门双倍经验简单题。对于空间大小为\(s1\timess2\)时,显然最多可得到的价值为\(\max(s2\timesv1,s1\timesv2)\),剩下小于\(s1\timess2\)的部分选一个占用空间大的枚举就好。时间复杂度:\(O(T\lfloor\frac{m}{\max(s1,s2)}\rfloor)\),其中\(m=n\bmo......
  • 【题解】Solution Set - NOIP2024集训Day57 字符串
    【题解】SolutionSet-NOIP2024集训Day57字符串https://www.becoder.com.cn/contest/5653「CF213E」TwoPermutations「CF961F」k-substrings「CF580E」KefaandWatch「CF504E」MishaandLCPonTree......
  • Codeforces Round 979 div2 个人题解(A~E)
    CodeforcesRound979div2个人题解(A~E)Dashboard-CodeforcesRound979(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cmath>#include<cstdio>#inc......
  • P11211 随机数生成器 题解
    前置知识:原根,exCRT。首先\(t=1\)是容易的,直接相邻的除一下即可。否则考虑询问除连续的\(5\)个数,分别为\(a_0,a_1,\cdots,a_4\)。首先特判掉存在\(a_i=0\)的情况,此时直接枚举\(s\)即可。我们先求出\(p\)的一个原根\(g\),设离散对数\(\log(x)=y\)表示\(g^y\equiv......
  • 牛客周赛Round64-B题题解
    牛客周赛Round64-B题题解题目描述:小红拿到了一个正整数,请你帮小红将其表示为幂(a^b)的形式。输入描述:一个正整数2<=x<=10^5输出描述:`第一行输出x。接下来每一行输出一个幂的表达式。请按指数从小到大的顺序输出。示例1输入16输出16=16^1=4^2=2^4解题思路:......