鱼C论坛

 找回密码
 立即注册
查看: 3583|回复: 34

蒟蒻求助,被今天 ARC 的第 2 题,折磨疯了,谁能帮忙看看么?

[复制链接]
发表于 2023-2-25 21:59:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:
给出由X,Y构成的长度N的字符串S。选择S中位于不同位置的K字符,如果选择的字符是X,则改成Y,如果是Y,则改成X。
请问修改K次后的字符串中Y彼此相邻的地方最大为多少,也就是有多少 i, 满足 1 <= i < n 并且 Si = Si+1 以及 Si == 'Y'


本人代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int n, k;
  4. char s[200011];
  5. int ypos[500011], tot, dtot;
  6. struct D {
  7.         int l, r, va;
  8. } d[500011];
  9. bool fd[500011];

  10. bool cmp(const D &a, const D &b) {
  11.         if (b.l == 0 || b.r == n + 1) return 1;
  12.         if (a.l == 0 || a.r == n + 1) return 0;
  13.         return a.va < b.va;
  14. }

  15. int main() {
  16.         scanf("%d%d%s", &n, &k, s + 1);
  17.         //printf("\n%d", cmp({0, 2, 1}, {4, 7, 2}));
  18.         //exit(0);
  19.         if (k == 0) {
  20.                 for (int i = 1; i < n; ++i) {
  21.                         if (s[i] == s[i + 1] && s[i] == 'Y') ++tot;
  22.                 }
  23.                 printf("%d", tot);
  24.                 return 0;
  25.         }
  26.         for (int i = 1; i <= n; ++i) {
  27.                 if (s[i] == 'Y') {
  28.                         ypos[++tot] = i;
  29.                 }
  30.         }
  31.         if (tot == 0) {
  32.                 printf("%d", k - 1);
  33.                 return 0;
  34.         }
  35.         for (int i = 1; i < tot; ++i) {
  36.                 if (ypos[i + 1] - ypos[i] - 1 == 0) continue;
  37.         ++dtot;
  38.                 d[dtot].l = ypos[i];
  39.                 d[dtot].r = ypos[i + 1];
  40.                 d[dtot].va = ypos[i + 1] - ypos[i] - 1;
  41.         }
  42.         if (ypos[1] != 0) {
  43.                 ++dtot;
  44.                 d[dtot].l = 0;
  45.                 d[dtot].r = ypos[1];
  46.                 d[dtot].va = ypos[1] - 1;
  47.         }
  48.         if (ypos[tot] != n) {
  49.                 ++dtot;
  50.                 d[dtot].l = ypos[tot];
  51.                 d[dtot].r = n + 1;
  52.                 d[dtot].va = n + 1 - ypos[tot] - 1;
  53.         }
  54.         sort(d + 1, d + dtot + 1, cmp);
  55.         //for (int i = 1; i <= dtot; ++i) {
  56.         //        printf("%d %d %d\n", d[i].l, d[i].r, d[i].va);
  57.         //}
  58.         for (int i = 1; i <= dtot && k; ++i) {
  59.                 for (int j = d[i].l + 1; j < d[i].r && k; ++j) {
  60.                         //assert(s[j] == 'X');
  61.                         s[j] = 'Y';
  62.             assert(fd[j] == 0);
  63.                         fd[j] = 1;
  64.                         --k;
  65.                 }
  66.         }
  67.         int res = 0;
  68.         for (int i = 1; i < n; ++i) {
  69.                 if (s[i] == s[i + 1] && s[i] == 'Y') {
  70.                         ++res;
  71.                 }
  72.         }
  73.         //        puts(s + 1);
  74.         if (k == 0) {
  75.                 printf("%d", res);
  76.                 return 0;
  77.         }
  78.         if (fd[1] == 0) {
  79.                 --res;
  80.                 --k;
  81.         }
  82.         if (fd[n] == 0 && k) {
  83.                 --res;
  84.                 --k;
  85.         }
  86.         for (int i = 2; i < n && k; ++i) {
  87.                 if (!fd[i]) {
  88.                        fd[i] = 1;
  89.                         res -= 2;
  90.                         --k;
  91.                 }
  92.         }
  93.         printf("%d", res);
  94.         return 0;
  95. }/*
  96. 10 5
  97. XYXYXXYYYX*/
复制代码

题目链接:https://atcoder.jp/contests/arc157/tasks/arc157_b
测评链接:https://atcoder.jp/contests/arc157/submissions/39197616

求助,我调了 70 分钟都没想出来,思路就是类似贪心,能最短的把一串 'Y' 连起来,就优先考虑,如果后面还有多余的 K,还是贪心尽量少减少答案

是不是那个细节没注意啊,求助各位,或者给一个 Hack 数据也可以,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-25 23:12:40 | 显示全部楼层
  1. 10 10
  2. YYYYYYYYYY
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-26 08:06:13 | 显示全部楼层
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int n, k;
  4. char s[200011];
  5. int ypos[200011], tot, dtot;
  6. struct D {
  7.         int l, r, va;
  8.         bool first;
  9. } d[200011];
  10. bool fd[200011];

  11. bool cmp(const D &a, const D &b) {
  12.         if (b.l == 0 || b.r == n + 1) return 1;
  13.         if (a.l == 0 || a.r == n + 1) return 0;
  14.         return a.va < b.va;
  15. }

  16. int main() {
  17.         scanf("%d%d%s", &n, &k, s + 1);
  18.         //printf("\n%d", cmp({0, 2, 1}, {4, 7, 2}));
  19.         //exit(0);
  20.         if (k == 0) {
  21.                 for (int i = 1; i < n; ++i) {
  22.                         if (s[i] == s[i + 1] && s[i] == 'Y') ++tot;
  23.                 }
  24.                 printf("%d", tot);
  25.                 return 0;
  26.         }
  27.         for (int i = 1; i <= n; ++i) {
  28.                 if (s[i] == 'Y') {
  29.                         ypos[++tot] = i;
  30.                 }
  31.         }
  32.         if (tot == 0) {
  33.                 printf("%d", k - 1);
  34.                 return 0;
  35.         }
  36.         for (int i = 1; i < tot; ++i) {
  37.                 if (ypos[i + 1] - ypos[i] - 1 == 0) continue;
  38.                 ++dtot;
  39.                 d[dtot].l = ypos[i];
  40.                 d[dtot].r = ypos[i + 1];
  41.                 d[dtot].va = ypos[i + 1] - ypos[i] - 1;
  42.                 d[dtot].first = 1;
  43.         }
  44.         sort(d + 1, d + dtot + 1, cmp);

  45.         if (ypos[1] - 1) {
  46.                 ++dtot;
  47.                 d[dtot].l = 0;
  48.                 d[dtot].r = ypos[1];
  49.                 d[dtot].va = ypos[1] - 1;
  50.                 d[dtot].first = 0;
  51.         }
  52.         if (ypos[tot] != n) {
  53.                 ++dtot;
  54.                 d[dtot].l = ypos[tot];
  55.                 d[dtot].r = n + 1;
  56.                 d[dtot].va = n + 1 - ypos[tot] - 1;
  57.                 d[dtot].first = 0;
  58.         }
  59.         //for (int i = 1; i <= dtot; ++i) {
  60.         //        printf("%d %d %d\n", d[i].l, d[i].r, d[i].va);
  61.         //}
  62.         for (int i = 1; i <= dtot && k; ++i) {
  63.                 for (int j = d[i].l + 1; j < d[i].r && k; ++j) {
  64.                         //assert(s[j] == 'X');
  65.                         s[j] = 'Y';
  66.                         fd[j] = 1;
  67.                         --k;
  68.                 }
  69.         }
  70.         int res = 0;
  71.         for (int i = 1; i < n; ++i) {
  72.                 if (s[i] == s[i + 1] && s[i] == 'Y') {
  73.                         ++res;
  74.                 }
  75.         }
  76.         //        puts(s + 1);
  77.         if (k == 0) {
  78.                 printf("%d", res);
  79.                 return 0;
  80.         }
  81.         if (fd[1] == 0) {
  82.                 s[1] = 'X';
  83.                 --res;
  84.                 --k;
  85.         }
  86.         if (fd[n] == 0 && k) {
  87.                 s[n] = 'X';
  88.                 --res;
  89.                 --k;
  90.         }
  91.         for (int i = 2; i < n && k; ++i) {
  92.                 if (!fd[i]) {
  93.                         s[i] = 'X';
  94.                         --k;
  95.                         if (s[i - 1] == 'Y') --res;
  96.                         if (s[i + 1] == 'Y') --res;
  97.                 }
  98.         }
  99.         printf("%d", res);
  100.         return 0;
  101. }/*
  102. 10 5
  103. XYXYXXYYYX*/
复制代码

https://atcoder.jp/contests/arc157/submissions/39207198

会不会就是最后那一段代码的问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 09:14:27 | 显示全部楼层
zhangjinxuan 发表于 2023-2-26 08:06
https://atcoder.jp/contests/arc157/submissions/39207198

会不会就是最后那一段代码的问题?
  1. 10 9
  2. XYYXXYXXYY


  3. XYYXXYXXYY
  4. YYYYYYYYYY
  5. YXXYYYYYXX
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-26 09:24:10 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 09:53:14 | 显示全部楼层
本帖最后由 jhq999 于 2023-2-26 10:00 编辑


  1. 10 9
  2. XYYXXYXXYY
  3. 3
复制代码

你的结果是3
正确应该是4
我发现一个规律,不知道是不是普遍性的不知道
如果K>Xlen,先把所有X变成Y,再从两边把Y变成X,
因为在一个连续的Y中,尽可能的在两边变成X,不要在中间变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-26 10:13:43 | 显示全部楼层
jhq999 发表于 2023-2-26 09:53
你的结果是3
正确应该是4
我发现一个规律,不知道是不是普遍性的不知道

我试过,也是从两边来变,但是只进步了一点,还是WA

有dp那味了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:43:18 | 显示全部楼层
大哥,这个世界上除了省选noip那样的难度,代码超过百行怎么可能
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-26 10:45:02 | 显示全部楼层
陈尚涵 发表于 2023-2-26 10:43
大哥,这个世界上除了省选noip那样的难度,代码超过百行怎么可能

或许这道题真的就是noip难度
但不太现实
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:45:09 | 显示全部楼层
而且没有注释,看的头大
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-26 10:45:55 | 显示全部楼层
陈尚涵 发表于 2023-2-26 10:45
而且没有注释,看的头大

我也要疯了啊,到后来自己都看不懂了,只能说一说思路了,算了,这道题我还是看题解把
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:47:29 | 显示全部楼层
zhangjinxuan 发表于 2023-2-26 10:45
或许这道题真的就是noip难度
但不太现实

懒得看英文,头大
可以简单解释下题意吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-26 10:48:24 | 显示全部楼层
陈尚涵 发表于 2023-2-26 10:47
懒得看英文,头大
可以简单解释下题意吗

给出由X,Y构成的长度N的字符串S。选择S中位于不同位置的K字符,如果选择的字符是X,则改成Y,如果是Y,则改成X。
请问修改K次后的字符串中Y彼此相邻的地方最大为多少,也就是有多少 i, 满足 1 <= i < n 并且 Si = Si+1 以及 Si == 'Y'

百度翻+人翻,希望能看得懂……

最后的最后,本题的灵魂:
  1. 1 <= n <= 2e5
  2. 0 <= k <= n
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:49:20 | 显示全部楼层
zhangjinxuan 发表于 2023-2-26 10:48
百度翻+人翻,希望能看得懂……

最后的最后,本题的灵魂:

这种编程题不能用机翻的,大哥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:49:36 | 显示全部楼层
zhangjinxuan 发表于 2023-2-26 10:48
百度翻+人翻,希望能看得懂……

最后的最后,本题的灵魂:

机翻会吞掉不少东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:51:32 | 显示全部楼层
zhangjinxuan 发表于 2023-2-26 10:48
百度翻+人翻,希望能看得懂……

最后的最后,本题的灵魂:

什么是Y彼此相邻
我尽量看懂题给你讲思路
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:53:57 | 显示全部楼层
为什么我一直显示你发的贴子撤销置顶了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:55:29 | 显示全部楼层
加好友了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 10:56:58 | 显示全部楼层
?人呢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-26 11:51:04 | 显示全部楼层
我想问一下为什么CE还能AC?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 17:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表