......
听CCR说这题没错是单调队列,一个人杀人的次数可以NlogN求出来。。。=调换的次数(没听懂。。。)
讲一下辛苦YY的O(n)做法:
令f[i]表示[i,n]中i杀人的次数
从后向前推
若i杀得到j(不会被其它人杀) 则
(1)i把j杀时j未杀完,j未杀的归i
(2)j杀完,i杀j
可以用单调队列判断j是i第几个杀的
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define MAXN (100000+10)
int n,st[MAXN],size=0,a[MAXN],kill[MAXN]={0},f[MAXN]={0};
int main()
{
freopen("CF319B.in","r",stdin);
int ans=0;
scanf("%d",&n);
For(i,n) cin>>a[i];
ForD(i,n)
{
int t=0;
while (size&&a[st[size]]<a[i]) {t++,f[i]=t=max(t,f[st[size]]),size--;}
st[++size]=i;
ans=max(ans,t);
}
cout<<ans<<endl;
return 0;
}