首页 > 其他分享 >ABC369F F - Gather Coins 题解

ABC369F F - Gather Coins 题解

时间:2024-09-01 20:03:02浏览次数:11  
标签:cnt Coins int 题解 Gather abc369 le maxn vec

题目链接:https://atcoder.jp/contests/abc369/tasks/abc369_f

题目大意:

在一个 \(H \times W\) 的二维迷宫中有 \(N\) 枚硬币,其中第 \(i\) 枚硬币在 \((R_i, C_i)\)(本题中,我们用 \((r, c)\) 表示二维迷宫中从上到下第 \(r\) 行从左到右第 \(c\) 列的那个格子)。

你一开始在迷宫的左上角 \((1, 1)\) 处,你要移动到一共的右下角 \((H, W)\),但是你每次移动智能向右或向下移动一格。

求:路径上最多能够收集到的硬币数?同时,还要求输出任意一种满足条件的移动方案。

数据范围:

  • \(2 \le H, W \le 2 \times 10^5\)
  • \(1 \le N \le min(HW-2, 2 \times 10^5)\)
  • \((R_i, C_i)\) 各不相同

题解

将所有有硬币的位置 \((r, c)\) 按升序排序。

这里我们定义 \((r_i, c_i) \lt (r_j, c_j)\) 当且仅当 \(r_i \lt r_j\) 或者 \(r_i = r_j\) 的情况下 \(c_i \lt c_j\) 。

我们假设最终移动的过程中依次手机到的硬币的位置构成的序列为:\((r'_1, c'_1)\),\((r'_2, c'_2)\),……,\((r'_k, c'_k)\)。

很明显 \(c'_1 \le c'_2 \le \ldots \le c'_k\)。

所以答案就是对 \((r_i, c_i)\) 排序之后对 \(c_i\) 求 LIS(这里是最长飞将子序列),求 LIS 的同时记录一下路径即可。

示例程序:

https://atcoder.jp/contests/abc369/submissions/57359342

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int H, W, n, f[maxn], m, pos[maxn], pre[maxn], ans;
struct Node {
    int r, c;

    bool operator < (const Node &b) const {
        return r < b.r || r == b.r && c < b.c;
    }
} a[maxn];

int main() {
    scanf("%d%d%d", &H, &W, &n);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &a[i].r, &a[i].c);
    sort(a+1, a+n+1);
    for (int i = 1; i <= n; i++) {
        int p = upper_bound(f, f+m, a[i].c) - f;
        if (p == m) m++;
        f[p] = a[i].c;
        pos[p] = i;
        if (p)
            pre[i] = pos[p-1];
    }
    printf("%d\n", m);
    vector<Node> vec;
    vec.push_back({H, W});
    for (int i = pos[m-1]; i; i = pre[i])
        vec.push_back({a[i].r, a[i].c});
    vec.push_back({1, 1});
    assert(vec.size() == m+2);
    reverse(vec.begin(), vec.end());
    for (int i = 0; i+1 < m+2; i++) {
        int cnt_d = vec[i+1].r - vec[i].r, cnt_r = vec[i+1].c - vec[i].c;
        while (cnt_d--) putchar('D');
        while (cnt_r--) putchar('R');
    }
    return 0;
}

参考资料:https://atcoder.jp/contests/abc369/editorial/10849

标签:cnt,Coins,int,题解,Gather,abc369,le,maxn,vec
From: https://www.cnblogs.com/quanjun/p/18391645

相关文章

  • 如何解决《罗马2全面战争》中的twitchsdk_32_release.dll错误模块跳出问题?实用技巧与
    当您启动《罗马2全面战争》时,可能会遇到与twitchsdk_32_release.dll相关的错误提示,这可能导致游戏无法正常运行。本篇文章将深入探讨这一问题的原因以及提供多种解决方法,帮助您顺利启动游戏。twitchsdk_32_release.dll错误模块跳出的原因twitchsdk_32_release.dll文件出现......
  • 【题解】Solution Set - 「蓝」题板刷
    【题解】SolutionSet-「蓝」题板刷始于:2024/9/1(其实之前大概做了十来道,但是没有记录。估计题会比较多,如果从代码里面过来的话,建议直接Ctrl/⌘+F题目名称。「USACO18JAN」MooTubeG2024/9/1一句话题意:https://www.luogu.com/discuss/125319给定一棵有边权的树,每次询......
  • 题解:AT_abc257_d [ABC257D] Jumping Takahashi 2
    [ABC257D]JumpingTakahashi2博客食用更佳:Myblog。大体思路这题是一道二分题,因为\(S\)越大,就越容易满足题目要求,\(S\)越小,就越难满足题目要求,符合二分的特点。下面先贴上二分代码。LLl=0,r=1e10;while(l<r){intmid=l+r>>1;if(check(mid))......
  • [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two--记忆化题解
    题目复述:链接跳转:[USACO2.4]两只塔姆沃斯牛TheTamworthTwo-洛谷#[USACO2.4]两只塔姆沃斯牛TheTamworthTwo##题目描述两只牛逃跑到了森林里。FarmerJohn开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。追击在$10\times10$的平面网......
  • [蓝桥杯 2020 省 A1] 超级胶水--题解
    题目再现:链接跳转:[蓝桥杯2020省A1]超级胶水-洛谷#[蓝桥杯2020省A1]超级胶水##题目描述小明有$n$颗石子,按顺序摆成一排,他准备用胶水将这些石子粘在一起。 每颗石子有自己的重量,如果将两颗石子粘在一起,将合并成一颗新的石子,重量是这两颗石子的重量之和。为......
  • [蓝桥杯 2016 省 A] 密码脱落--最长公共子序列题解
    题目复述:题目链接:[蓝桥杯2016省A]密码脱落-洛谷#[蓝桥杯2016省A]密码脱落##题目描述X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D四种植物的种子串成的序列。仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的回文串)。......
  • 「NOI2022 D2T2 冒泡排序」题解
    题意uoj768构造长为\(n\)的序列\(a\),满足\(m\)条限制:\(\min_{j=L_i}^{R_i}\{a_j\}=V_i\),要求逆序对数最少题解21pts暴力先进行一些观察:逆序对只关心相对大小,所以\(\foralla_j\)必然\(\in\{V_i\}\),可以完全离散化经典结论:若\(i<j,a_i>a_j\)且交换后合法,则交换......
  • 【题解】Solution Set - NOIP2024模拟赛4
    【题解】SolutionSet-NOIP2024模拟赛4https://www.becoder.com.cn/contest/5501T2沉默乐团https://www.becoder.com.cn/submission/2593352T3深黯「军团」记录一下考场思路:首先对于长度为\(n\)所有排列,按顺序求出她的逆序对数量。然后找到了规律。后面基于此,写出......
  • abc369 题解
    切了A~F,还挺开心(但是如果上一次把G切了的话,我就上青了QAQ比赛链接:https://atcoder.jp/contests/abc369A-369题意:给定正整数\(a,b\)(\(1\lea,b\le100\)),请问有多少个整数\(x\)满足\(a,b,x\)排序后构成等差数列。思路:观察到\(a,b\)范围很小,直接枚举\(x\)即可。......
  • 题解:洛谷 P10996 【MX-J3-T3】Tuple
    原题链接介绍一种(也许是正解的)卡常做法先说总体思路:对于每个三元组\((x,y,z)\),若有一个\(w\)满足\((x,y,w),(x,z,w),(y,z,w)\)均存在,则找到了一个合法的四元组\((x,y,z,w)\)。\(20\\rm{Pts}\)做法如果暴力搜索,在遍历每一个三元组时,每一次都扫描所有的\(w\in[1,N]\)......