zoukankan      html  css  js  c++  java
  • 洛谷 P1878 舞蹈课

    P1878 舞蹈课

    小根堆

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 #define maxn 200005
     4 #define inf 1<<30
     5 using namespace std;
     6 struct data{
     7     int w,pos;    
     8 };
     9 bool operator > (data a,data b){ return a.w>b.w||(a.w==b.w&&a.pos>b.pos); }
    10 int n,ans;
    11 int a[maxn],nxt[maxn],pre[maxn],a1[maxn],a2[maxn];
    12 char ch[maxn];
    13 bool if_[maxn];
    14 priority_queue<data,vector<data>,greater<data> >q;
    15 inline int read()
    16 {
    17     int x=0,f=1;char ch=getchar();
    18     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    19     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    20     return x*f;
    21 }
    22 
    23 int main()
    24 {
    25     n=read(); if_[0]=1;
    26     scanf("%s",ch+1);
    27     for(int i=1;i<=n;i++) a[i]=read();
    28     for(int i=1;i<n;i++) nxt[i]=i+1;
    29     for(int i=2;i<=n;i++) pre[i]=i-1;
    30     for(int i=1;i<n;i++)
    31         if(ch[i]!=ch[i+1])
    32             q.push((data){abs(a[i]-a[i+1]),i});
    33     while(!q.empty())
    34     {
    35         int mn=q.top().w,now=q.top().pos; q.pop();
    36         int l=pre[now],t=nxt[now],r=nxt[t];
    37         if(if_[now]||if_[t]) continue;
    38         if(abs(a[now]-a[t])!=mn||ch[now]==ch[t]) continue;
    39         if_[now]=if_[t]=1;
    40         a1[++ans]=now; a2[ans]=t;
    41         if(l&&r&&ch[r]!=ch[l]) q.push((data){abs(a[r]-a[l]),l});
    42         nxt[l]=r; pre[r]=l;
    43     }
    44     printf("%d
    ",ans);
    45     for(int i=1;i<=ans;i++)
    46         printf("%d %d
    ",a1[i],a2[i]);
    47     return 0;
    48 }
  • 相关阅读:
    有关Fragment的知识点
    DashPathEffect
    Android 自定义View
    Android Parcelable
    Android之Activity状态的保存和恢复
    Android WebView介绍
    了解Android的编译器
    WebView
    使用RichEdit程序无法启动
    WTL布局对话框 CDialogResize
  • 原文地址:https://www.cnblogs.com/chen74123/p/7468058.html
Copyright © 2011-2022 走看看