分析:
设置结构体lap{ int m,s; },设置结构体数组l[n],按m从大到小排序。接下来遍历l[n],并用一个单调递减栈去维护,详解见代码。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const int inf=0x7f7f7f7f;
struct lap
{
int m,s;
}l[maxn];
bool cmp(lap x,lap y)
{
return x.m>y.m;
};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>l[i].m>>l[i].s;
sort(l+1,l+1+n,cmp);
int cnt=0;
stack<int> st;
for(int i=1;i<=n;i++)
{
if(i==1) st.push(i);
else if(l[i].s<l[st.top()].s) //满足单调递减的条件
{
cnt++; //说明此时电脑i被栈中的电脑完虐,cnt++
st.push(i); 入栈
}
else //不满足,说明电脑i没有被完虐
{
while(!st.empty())
{
st.pop(); //弹栈,找到电脑i的入栈位置
if(!st.empty()&&l[i].s<l[st.top()].s) //
break;
}
if(!st.empty()) cnt++; //如果此时栈还未空,说明栈中存在完虐电脑i的电脑,cnt++
st.push(i);
}
}
cout<<cnt<<endl;
return 0;
}
关于为什么当l[i].s<l[st.top()].s时要弹栈,可以想象得到,此时因为栈顶所指定的电脑的s小于当前电脑的s了,那么如果我们将电脑i入栈,因为它的s值更大,因此更有可能完虐后面的电脑,所以这时需要弹栈,为i寻找入栈位置。