思路:priority_queue+pair
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define mem(a,b) memset(a,b,sizeof(a)) const int N=2e5+5; int pre[N]; int nxt[N]; int col[N]; int num[N]; priority_queue<pair<int,int> >q,del; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,a,cnt=0,ans=0; cin>>n; for(int i=0;i<n;i++) { cin>>a; if(a==col[cnt])num[cnt]++; else col[++cnt]=a,num[cnt]=1; } for(int i=1;i<=cnt;i++)pre[i]=i-1,nxt[i]=i+1,q.push(mp(num[i],-i));//建立链表,区间入队,-i是因为优先选择最左边的区间 while(cnt) { while(!del.empty()&&del.top()==q.top())del.pop(),q.pop();//删除已经被合并的区间 a=-q.top().second; q.pop(); int t=pre[a],_t=nxt[a]; pre[_t]=t,nxt[t]=_t; if(t&&col[t]==col[_t])//如果左右两个区间颜色一样,合并两个区间 { del.push(mp(num[t],-t)),del.push(mp(num[_t],-_t));//把合并前的区间放进待删队列 num[t]+=num[_t],nxt[t]=nxt[_t],pre[nxt[_t]]=t; q.push(mp(num[t],-t)); cnt--; } cnt--; ans++; } cout<<ans<<endl; return 0; }