zoukankan      html  css  js  c++  java
  • Codeforces 899E

    899E - Segments Removal

    思路: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;
    }
  • 相关阅读:
    443. String Compression
    506. Relative Ranks
    825. Friends Of Appropriate Ages
    447. Number of Boomerangs
    54. Spiral Matrix
    744. Find Smallest Letter Greater Than Target
    HDU-1565 方格取数(1)
    zoj 3672 Gao The Sequence
    ZOJ 3675 Trim the Nails
    poj -2955 Brackets
  • 原文地址:https://www.cnblogs.com/widsom/p/8079330.html
Copyright © 2011-2022 走看看