跳到主要内容

Dishwashing

· 阅读需 2 分钟

贪心一下每次放一个盘子,如果下一个是xx需要满足以下情况:

<1> 找到一堆极左的盘子,满足该堆盘子里至少有一个盘子编号大于xx。

<2> 如果该堆盘子中有小于xx的,就把所有小于xx的盘子拿走洗掉以保证单调性

AIAI 说时间复杂度均摊的O(n+n)O(n+n),但是也可以二分O(nlogn)O(nlogn)解决

/*
先将较小的尽量放在左边,如果序列中有更小的就弹出

woc怎么样例全过了
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair< int,int >
#define QWQ return 0;
#define QAQ return

const int N=1e5+10;

int idx1[N];
stack< int > idx2[N];

int main()
{
// freopen( "1.in","r",stdin );
// freopen( "1.out","w",stdout );
ios::sync_with_stdio( false );
cin.tie( nullptr ); cout.tie( nullptr );
int n;
cin>>n;
int pre=0;
for( int i=1, x;i<=n;i++ )
{
cin>>x;
if( x < pre )
{ cout<<i-1; QWQ }
for( int j=x;j>=1 && !idx1[j];j-- ) idx1[j]=x;
while( !idx2[idx1[x]].empty() && idx2[idx1[x]].top() < x )
pre=idx2[idx1[x]].top(), idx2[idx1[x]].pop();
idx2[idx1[x]].push( x );
}
cout<<n;
QWQ
}