AtCoder Beginner Contest 354 C - AtCoder Magics

Problem Statement

Takahashi has 𝑁 cards from the card game "AtCoder Magics." The 𝑖-th card will be called card 𝑖. Each card has two parameters: strength and cost. Card 𝑖 has a strength of 𝐴𝑖 and a cost of 𝐶𝑖.

He does not like weak cards, so he will discard them. Specifically, he will repeat the following operation until it can no longer be performed:

  • Choose two cards 𝑥 and 𝑦 such that 𝐴𝑥>𝐴𝑦and 𝐶𝑥<𝐶𝑦. Discard card 𝑦.

It can be proved that the set of remaining cards when the operations can no longer be performed is uniquely determined. Find this set of cards.

Constraints

  • 2≤𝑁≤2×105
  • 1≤𝐴𝑖,𝐶𝑖≤109
  • 𝐴1,𝐴2,...,𝐴𝑁 are all distinct.
  • 𝐶1,𝐶2,...,𝐶𝑁 are all distinct.
  • All input values are integers.

Input

The input is given from Standard Input in the following format:

复制代码
𝑁
𝐴1​ 𝐶1​
𝐴2​ 𝐶2
⋮⋮
𝐴𝑁​ 𝐶𝑁

Output

Let there be 𝑚 remaining cards, cards 𝑖1,𝑖2,...,𝑖𝑚​, in ascending order. Print these in the following format:

复制代码
𝑚
𝑖1 𝑖2​ ⋯⋯ 𝑖𝑚

Sample Input 1Copy

Copy

复制代码
3
2 4
1 1
3 2

Sample Output 1Copy

Copy

复制代码
2
2 3

Focusing on cards 1 and 3, we have 𝐴1<𝐴3​ and 𝐶1>𝐶3​, so card 1 can be discarded.

No further operations can be performed. At this point, cards 2 and 3 remain, so print them.

Sample Input 2Copy

Copy

复制代码
5
1 1
10 2
100 3
1000 4
10000 5

Sample Output 2Copy

Copy

复制代码
5
1 2 3 4 5

In this case, no cards can be discarded.

Sample Input 3Copy

Copy

复制代码
6
32 101
65 78
2 29
46 55
103 130
52 40

Sample Output 3Copy

Copy

复制代码
4
2 3 5 6

首先声明本篇博客代码取自https://atcoder.jp/contests/abc354/editorial/10048
自己加一些感悟,用朴素的语言来解释这道题目

题目大意:

首先,要明白这道题要我们做什么,就是丢弃这些卡片,然后输出剩余卡片的编号,那么什么样的卡片要舍弃呢?如果这个卡片它又贵还又弱,那么我们就不要它。

因此我们对所有的卡片进行按照cost从小到大排序,v表示前i-1张卡片中最强的力量,如果第i张卡片力量大于等于v,说明这种卡片可以保留。反之,如果第i张卡片比i弱,又因为它还贵,那么我们就不要这张卡片了

代码实现:

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>

using namespace std;

struct Card
{
    int a;
    int c;
    int index;
};

int main()
{
    int n;
    cin>>n;
    vector<Card> cards(n);
    for(int i=0; i<n; i++)
    {
        int a,c;
        cin>>a>>c;
        cards[i]= {a,c,i};
    }
    sort(cards.begin(),cards.end(),[&](const auto &l,const auto &r)
    {
        return l.c<r.c;
    });
    vector<int> ans;
    int v=0;
    for(int i=0;i<n;i++)
    {
        if(cards[i].a>=v)
        {
            v=cards[i].a;
            ans.push_back(cards[i].index);
        }
    }
    sort(ans.begin(),ans.end());
    const int m=(int)ans.size();
    cout<<m<<endl;
    for(int i=0;i<m;i++)
    {
        cout<<ans[i]+1;
        if(i==m-1) cout<<endl;
        else cout<<" ";
    }
    return 0;
}
相关推荐
风吹心凉20 分钟前
python3基础2026.7.22
开发语言·python
qq_4523962328 分钟前
第五篇:《接口与错误处理:Go 的哲学》
开发语言·后端·golang
Escalating_xu42 分钟前
C++可变参数模板与引用折叠精讲
开发语言·c++
wuyk5551 小时前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
云泽8081 小时前
Visual Studio 2026 新手保姆级教程:环境搭建、界面优化与编译器配置详解
开发语言·c++·c·开发工具·visual studio
2zcode2 小时前
基于MATLAB深度学习的乳腺钼靶影像乳腺癌智能诊断系统设计与实现
开发语言·深度学习·matlab·乳腺癌
MoonBit月兔2 小时前
错过大赛报名?MoonBit 开源大赛- 8 月黑客松正式开启
开发语言·ai-native·moonbit
weixin_538601972 小时前
智能体测开Day31
开发语言·python
geovindu2 小时前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7772 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring