# 題目

AP325 Q-7-11. 紅白彩帶 (APCS)

# 解題思路

目前沒東西...

# 程式碼

#include <bits/stdc++.h>
using namespace std;
#define N 100005
int p[N],maxn=0;
bool color[N];
multiset<int> mst;
int find(int x){
    if(p[x]<0)
        return x;
    return p[x]=find(p[x]);
}
void unionn(int x,int y){
    int r1=find(x);
    int r2=find(y);
    auto it=mst.find(-p[r1]);
    mst.erase(it);
    it=mst.find(-p[r2]);
    mst.erase(it);
    if(p[r1]>p[r2]){
        p[r2]+=p[r1];
        p[r1]=r2;
        mst.insert(-p[r2]);
        maxn=max(maxn,-p[r2]);
    }else{
        p[r1]+=p[r2];
        p[r2]=r1;
        mst.insert(-p[r1]);
        maxn=max(maxn,-p[r1]);
    }
}
int main(){
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>color[i];
        if(color[i]){
            p[i]=-1;
            mst.insert(1);
            if(color[i-1]==1) unionn(i,i-1);
        }
    }
    int mx=*mst.rbegin(),mn=*mst.begin();
    for(int i=0,temp;i<k;i++){
        cin>>temp;
        color[temp]=1;
        p[temp]=-1;
        mst.insert(1);
        for(int j=-1;j<2;j+=2){
            if(color[temp+j]) unionn(temp,temp+j);
        }
        mx+=maxn;
        mn+=*mst.begin();
    }
    cout<<mx<<"\n"<<mn;
    return 0;
}