代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int maxn=1e6+5;
int n,x,k,mx,ans;
vector<int> b[maxn];
P a[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;mx=max(mx,x);
b[x].push_back(i);
}
for(int i=1;i<=mx;i++) reverse(b[i].begin(),b[i].end());
for(int i=1;i<=mx;i++)
for(int j=0;j<b[i].size();j++) a[++k]=P{i,b[i][j]};
int l=1,r=2;
while(r<=n)
{
while(r<=n&&a[r].first==a[l].first) r++;
if(r>n) break;
while(l<r&&(a[l].second>a[r].second||a[r].first-a[l].first!=1)) l++;
if(l==r) continue;
if(r-l==1) l++,r++;
l++;r++;ans++;
}
cout<<ans;
return 0;
}
思路:首先对数组进行桶排序,并对每个桶里的编号进行翻转,使得编号从大到小,接下来就是双指针部分,每次找到可以匹配的一对。