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

「题解」Codeforces Round 888 (Div. 3)

时间:2023-10-05 19:33:33浏览次数:36  
标签:return int 题解 scanf 888 long -- Div ll

A. Escalator Conversations

Problem

题目

Sol & Code

签到

#include <bits/stdc++.h>

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int T, n, m, k, h;

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d %d %d", &n, &m, &k, &h);
    int ans = 0;
    for (int i = 1, x; i <= n; ++i) {
      scanf("%d", &x);
      if (x == h) continue;
      int d = std::abs(x - h);
      if (d % k == 0 && d / k < m) ++ans;
    }
    printf("%d\n", ans);
  }
  return 0;
}

B. Parity Sort

Problem

题目

Sol & Code

只能奇数之间交换,偶数之间交换,就看奇偶数分别排序后在插回去是否有序。

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

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int T, n, a[N], b[N], c[N];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    int cnt1 = 0, cnt2 = 0;
    for (int i = 1; i <= n; ++i) {
      scanf("%d", &a[i]);
      if (a[i] & 1) b[++cnt1] = a[i];
      else c[++cnt2] = a[i];
    }
    std::sort(b + 1, b + cnt1 + 1);
    std::sort(c + 1, c + cnt2 + 1);
    bool okay = true;
    int cnt1_ = 1, cnt2_ = 1;
    for (int i = 1; i <= n; ++i) {
      if (a[i] & 1) a[i] = b[cnt1_++];
      else a[i] = c[cnt2_++];
      if (a[i] < a[i - 1]) { okay = false; break; }
    }
    puts(okay ? "YES" : "NO");
  }
  return 0;
}

C. Tiles Comeback

Problem

题目

Sol & Code

贪心,看首尾两个数是否出现了足够多次且不相交(抽象)。

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

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

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]);
    int p1 = 0, p2 = 0;
    for (int i = 1, cnt = 0; i <= n; ++i) {
      if (a[i] == a[1]) ++cnt;
      if (cnt == k) { p1 = i; break; }
    }
    for (int i = n, cnt = 0; i >= 1; --i) {
      if (a[i] == a[n]) ++cnt;
      if (cnt == k) { p2 = i; break; }
    }
    if (a[1] == a[n]) {
      if (!p1) puts("NO");
      else puts("YES");
    } else {
      if (!p1 || !p2 || p1 >= p2) puts("NO");
      else puts("YES");
    }
  }
  return 0;
}

D. Prefix Permutation Sums

Problem

题目

Sol & Code

看相邻两个数之间的差值,以及最大值是否是 \(1+2+\dots+n\)。

差值要求 \(1\sim n\) 每个数都出现一次。判断是否满足即可。

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

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

ll a[N], d[N];
int T, n, vis[N];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) vis[i] = 0;
    int cnt1 = 0, cnt2 = 0, ret = 0;
    bool okay = true;
    for (int i = 1; i < n; ++i) scanf("%lld", &a[i]);
    for (int i = 1; i < n; ++i) {
      d[i] = a[i] - a[i - 1];
      if (d[i] > 2 * n - 1) { okay = false; break; }
      if (d[i] > n) {
        if (cnt1 || cnt2) { okay = false; break; }
        ++cnt1, ret = d[i];
      } else {
        if (vis[d[i]]) {
          if (cnt2 || cnt1) { okay = false; break; }
          ++cnt2;
        }
        ++vis[d[i]];
      }
    }
    if (!okay) { puts("NO"); continue; }
    else {
      int res = 0, cnt = 0;
      for (int i = 1; i <= n; ++i) {
        if (!vis[i]) res += i, ++cnt;
      }
      if (cnt == 1 || vis[res] == 2 || res == ret) puts("YES");
      else puts("NO");
    }
  }
  return 0;
}

E. Nastya and Potions

Problem

题目

Sol & Code

若 \(a\) 能和其他的混合成 \(b\) 就由 \(a\) 向 \(b\) 连线。

拓扑序 dp

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

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int cnt, head[N];
std::queue<int> q;
int T, n, k, f[N], du[N], res[N];
struct Edge {
  int v, nxt;
}e[N << 1];

void add(int u, int v) {
  e[++cnt].v = v, e[cnt].nxt = head[u], head[u] = cnt;
}

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; ++i) scanf("%d", &f[i]), res[i] = 0, head[i] = 0;
    for (int i = 1, x; i <= k; ++i) {
      scanf("%d", &x);
      f[x] = 0;
    }
    cnt = 0;
    for (int i = 1, x; i <= n; ++i) {
      scanf("%d", &x);
      for (int j = 1, u; j <= x; ++j) {
        scanf("%d", &u);
        add(u, i);
        ++du[i];
      }
    }
    for (int i = 1; i <= n; ++i) {
      if (du[i] == 0) q.push(i);
    }
    while (!q.empty()) {
      int u = q.front();
      for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].v;
        res[v] += f[u];
        if (res[v] >= f[v]) res[v] = f[v];
        --du[v];
        if (du[v] == 0) {
          f[v] = min(f[v], res[v]);
          q.push(v);
        }
      }
      q.pop();
    }
    for (int i = 1; i <= n; ++i) printf("%d ", f[i]);
    puts("");
  }
  return 0;
}

F. Lisa and the Martians

Problem

题目

Sol & Code

使 \((a_i\oplus x)\&(a_j \oplus x)\) 最大。

找两两之间不同的位的最高位最低的两个数。然后构造 \(x\) 使相同的位都为 \(1\) 即可。

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

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int T, n, k;
struct qwq {
  int x, id;
  friend bool operator < (qwq q1, qwq q2) {
    return q1.x < q2.x;
  }
}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].x);
      a[i].id = i;
    }
    std::sort(a + 1, a + n + 1);
    int ans, minn = 2147483647;
    for (int i = 1; i < n; ++i) {
      int flag = a[i].x ^ a[i + 1].x;
      if (flag < minn) {
        minn = flag;
        ans = i;
      }
    }
    printf("%d %d ", a[ans].id, a[ans + 1].id);
    int x = 0;
    for (int i = 0; i < k; ++i) {
      if (minn & (1 << i)) continue;
      else {
        if (a[ans].x & (1 << i)) x += 0;
        else x += (1 << i);
      }
    }
    printf("%d\n", x);
  }
  return 0;
}

标签:return,int,题解,scanf,888,long,--,Div,ll
From: https://www.cnblogs.com/poi-bolg-poi/p/17743804.html

相关文章

  • 「题解」Codeforces Round 891 (Div. 3)
    A.ArrayColoringProblem题目Sol&Code只有数列的和为偶数时才符合要求,即有任意个偶数,偶数个奇数。将这些数分成两部分,发现两部分初始值\(0\)为偶数,偶数不会影响奇偶性,故需要偶数个奇数。#include<bits/stdc++.h>#defineN51typedeflonglongll;intmin(inta,......
  • P9712 「QFOI R1」贴贴 の 题解
    这道题比较典型。大概就是你先输出solution-,之后再处理其他的。之后遍历字符串,如果发现是大写,就给转成小写,之后输出,如果发现是减号,就输出字符串,都不是就直接输出该字符串的第\(i\)个字符。#include<iostream>#include<string>usingnamespacestd;strings;intlen;int......
  • 实现文档AI搜索,提高问题解决效率
    在当今的数字时代,以AI为动力的文档搜索变得越来越重要。随着在线提供信息的指数增长,传统的搜索方法通常效率低下且耗时。实施文档AI搜索可以显著提高搜索相关文档的效率和有效性。|在网站中实施文档AI搜索的好处很多首先,它通过提供无缝且直观的搜索过程来增强用户体验。借助文档AI......
  • 【基环树 | 题解】P5022 [NOIP2018 提高组] 旅行
    前言一日知基环树弱,固补题。关于基环树基环树定义一个环,环上每个点都有一颗以该点为根的树,如下图为一棵基环树关于基环树常规思路通常来说基环树常规思路是先处理环上树的结果,后通过树的结果来处理换上结果。具体处理方式依照题目来定。然而只是通常来说因为基环树的问......
  • CF1249(Div. 3) 题解(A to D)
    \(\texttt{EF}\)忘(不)记(会)写了。AYetAnotherDividingintoTeams题解题目大意有一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\),将他们分为若干组,使得每一组没有两个数的差为\(1\),使分的组数尽可能少。解题思路排完序后对于任意\(1\lei<n\)均有\(a_i\)与\(a_{i......
  • Luogu CF1174C 题解
    这道题其实不难。\(\gcd(i,j)=1\),其实就是\(i\)与\(j\)互质。如果\(i\)与\(j\)不互质,那么我们一定要让\(a_i\)与\(a_j\)相同,只有这样,才能使\(a\)序列中的最大值最小化。所以,我们可以使用埃氏筛法,当筛到质数时,给它和它的倍数都赋值为一个新数。ACCode:#include......
  • Luogu P8651 题解
    这是让我最崩溃的一道橙题了。整整11次提交才AC。这道题有几个要点必须注意:判断日期是否合理。按顺序输出。判断重复的日期。首先,我们来看怎么判断日期是否合理。我们知道大月有\(31\)天,小月有\(30\)天,二月看平年闰年。所以,我们可以写出这样的代码:boolc......
  • Luogu CF1469B 题解
    这道题其实并不难。题目大意是这样的:已知两个序列\(r\)和\(b\),求出合并后的最大前缀和。很好发现:答案就是\(r\)和\(b\)各自的最大前缀和之和。但要注意:\(r\)和\(b\)可以什么都不取,因此\(maxa\)和\(maxb\)初始要赋值为\(0\)。ACCode:#include<iostream>using......
  • Luogu CF755B 题解
    这题其实不难。两人最佳的方案就是先说对方会的词。不难证明,设先手会说\(n\)个单词,后手会说\(m\)个单词,若\(n>m\),则先手胜,若\(n<m\),则后手胜。那如果\(n=m\)呢?假设两人都会说的单词数为\(k\),那么一番推理发现,当两人说了\(k-1\)次,就没有两人都会的词了,可以回到之......
  • Luogu CF1133B 题解
    这道题其实很简单要让两数和为\(k\)的倍数,需要满足以下两条件之一:两数都是\(k\)的倍数两数的余数和为\(k\)因此,我们可以先统计出余数再按上述条件算出共有多少组,即可得到答案注意:当\(k\)为偶数时,余数为\(k/2\)的数要两两配对,不要多算这里统计的是组数,......