C - AtCoder Magics (abc354 C)
思路:
将卡片的花费从小到大排序,第一个必选,然后所有的卡片的价值一定是单调递增的
因为是按顺序枚举 j𝑗,则 i<j𝑖<𝑗的卡牌都满足 ci<cj𝑐𝑖<𝑐𝑗,如果存在ai>aj𝑎𝑖>𝑎𝑗,则说明当前卡牌要丢弃。所以我们维护 max1≤i<j(ai)max1≤𝑖<𝑗(𝑎𝑖),一个前缀的强度最大值,如果 maxa>aj𝑚𝑎𝑥𝑎>𝑎𝑗,说明当前卡牌 j𝑗要丢弃,否则就不用丢弃。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
struct node
{
int a,c,num;
}w[N];
int n;
bool cmp(node a,node b)
{
return a.c<b.c;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i].a>>w[i].c;
w[i].num=i;
}
sort(w+1,w+1+n,cmp);
vector<int> ans;
int maxx=0;
for(int i=1;i<=n;i++)
{
if(w[i].a>maxx)
{
ans.push_back(w[i].num);
maxx=w[i].a;
}
}
sort(ans.begin(),ans.end());
cout<<ans.size()<<endl;
for(auto t : ans)
{
cout<<t<<' ';
}
return 0;
}