桶排+双指针45pts求调
查看原帖
桶排+双指针45pts求调
1471260
guoshengyu1231楼主2025/6/21 11:49

代码如下:

#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]}/*,cout<<a[k].first<<' '<<a[k].second<<"\n"*/;
	int l=1,r=2;
	while(r<=n)
	 {
	 	//cout<<l<<' '<<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;
	 	//cout<<l<<' '<<r<<"\n";
		if(r-l==1) l++,r++;
	 	l++;r++;ans++;
	 }
	cout<<ans;
	return 0;
} 

思路:首先对数组进行桶排序,并对每个桶里的编号进行翻转,使得编号从大到小,接下来就是双指针部分,每次找到可以匹配的一对。

2025/6/21 11:49
加载中...