cf899e 链表+优先队列

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>

using namespace std;

int n;
struct node
{
    int pre=0,nxt=0;
    int val,cnt=0;
}itm[200005];

int cnt;

struct node1
{
    int cnt;
    int id;

    friend bool operator<(node1 a,node1 b)
    {
        if(a.cnt==b.cnt)
            return a.id>b.id;
        else
            return a.cnt<b.cnt;
    }
};

int main()
{
    while(~scanf("%d",&n))
    {
        cnt=0;
        priority_queue<node1> q;

        for(int i=0;i<n;i++)
        {
            int tp;
            scanf("%d",&tp);
            if(i==0)
            {
                itm[++cnt].val=tp;
                itm[cnt].cnt=1;
            } else
            {
                if(tp==itm[cnt].val)
                {
                    itm[cnt].cnt++;
                } else
                {
                    itm[++cnt].val=tp;
                    itm[cnt].cnt=1;
                }
            }
        }
        for(int i=1;i<=cnt;i++)
        {
            itm[i].pre=itm[i].nxt=0;

            if(i!=cnt)
                itm[i].nxt=i+1;
            if(i!=1)
                itm[i].pre=i-1;

            node1 tp;
            tp.cnt=itm[i].cnt;
            tp.id=i;
            q.push(tp);
        }

        int ans=0;
        while(!q.empty())
        {
            node1 cur=q.top();
            q.pop();
            if(cur.cnt==itm[cur.id].cnt)
            {
                ans++;
                int tid=cur.id;

                itm[tid].cnt=0;

                if(!(itm[tid].pre==0 && itm[tid].nxt==0))
                {
                    if(itm[tid].pre==0)
                    {
                        itm[itm[tid].nxt].pre=0;
                    }
                    else if(itm[tid].nxt==0)
                    {
                        itm[itm[tid].pre].nxt=0;
                    }
                    else
                    {
                        int pre=itm[tid].pre;
                        int nxt=itm[tid].nxt;

                        if(itm[pre].val==itm[nxt].val)
                        {
                            itm[pre].cnt+=itm[nxt].cnt;
                            itm[pre].nxt=itm[nxt].nxt;
                            if(itm[nxt].nxt!=0)
                                itm[itm[nxt].nxt].pre=pre;

                            itm[nxt].cnt=0;

                            node1 nd;
                            nd.id=pre;
                            nd.cnt=itm[pre].cnt;
                            q.push(nd);
                        }
                        else
                        {
                            itm[pre].nxt=nxt;
                            itm[nxt].pre=pre;
                        }
                    }
                }
            }
        }
        printf("%d\n",ans);

    }
}

猜你喜欢

转载自blog.csdn.net/c_czl/article/details/88067686
今日推荐