sadpairs

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
    char ch;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
namespace Miracle{
const int N=4e5+5;
int n,m;
struct node{
    int nxt,to;
}e[2*N];
int hd[N],cnt;
void add(int x,int y){
    e[++cnt].nxt=hd[x];
    e[cnt].to=y;
    hd[x]=cnt;
}
int dfn[N],low[N],df,dfn2[N];
int co[N],b[N],dcc;
vector<int>mem[N];
ll preno;
vector<int>be[N];
int typ[N];//1:yuan 0:fang
int sta[N],top;
void tarjan(int x){
    dfn[x]=low[x]=++df;
    sta[++top]=x;
    for(reg i=hd[x];i;i=e[i].nxt){
        int y=e[i].to;
        if(!dfn[y]){
            tarjan(y);
            low[x]=min(low[x],low[y]);
            if(low[y]>=dfn[x]){
                ++dcc;
                int z;
                do{
                    z=sta[top];
                    mem[dcc].push_back(z);
                    --top;
                }while(z!=y);
                mem[dcc].push_back(x);
            }
        }else low[x]=min(low[x],dfn[y]);
    }
}
void dfs1(int x){
    dfn[x]=++df;
    for(reg i=hd[x];i;i=e[i].nxt){
        int y=e[i].to;
        if(!dfn[y])dfs1(y);
    }
    dfn2[x]=df;
}
ll dp[N];
ll tag[N];

void dfs2(int x){
    
}
ll ans[N];

void sol(int x){
    
}
int main(){
    rd(n);rd(m);
    int tot=0;
    for(reg i=1;i<=n;++i) rd(co[i]),b[++tot]=co[i];
    sort(b+1,b+tot+1);
    tot=unique(b+1,b+tot+1)-b-1;
    for(reg i=1;i<=n;++i){
        co[i]=lower_bound(b+1,b+tot+1,co[i])-b;
        be[co[i]].push_back(i);
    }
    for(reg i=1;i<=n;++i){
        if(!dfn[i]) tarjan(i);
    }
    memset(hd,0,sizeof hd);
    memset(dfn,0,sizeof dfn);
    df=0;cnt=0;
    int tot=n;
    for(reg i=1;i<=dcc;++i){
        ++tot;
        typ[tot]=0;
        for(reg j=0;j<(int)mem[i].size();++j){
            typ[mem[i][j]]=1;
            add(tot,mem[i][j]);
            add(mem[i][j],tot);
        }
    }
    for(reg i=1;i<=tot;++i){
        if(!dfn[i]){
            dfs1(i);
        }
    }
    
    for(reg i=1;i<=)
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2019/2/19 17:48:21
*/
原文地址:https://www.cnblogs.com/Miracevin/p/10403807.html