社区讨论

(强连通水紫)萌新求救

CF467D Fedor and Essay参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo2c1ckv
此快照首次捕获于
2023/10/23 11:22
2 年前
此快照最后确认于
2023/11/03 11:31
2 年前
查看原帖
蒟蒻调了一上午了~~(0v0)~~
跪请各位dalao帮帮忙吧
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dfn[600005],low[600005],dep,lf[600005];
bool visitt[600005];//q即桥
int color[600005],ct=0,bl[600005];
int nnext[600005],tto[600005],edge[600005],sta[600005],llast[600005],ttot=0;
void add(int inn,int jnn)
{
    nnext[++ttot]=llast[inn];
    sta[ttot]=inn;
    tto[ttot]=jnn;
    llast[inn]=ttot;
}//建图
int nxt[600005],nto[600005],nedge[600005],nsta[600005],nlast[600005],ntot=0;
void nadd(int inn,int jnn)
{
    nxt[++ttot]=nlast[inn];
    nsta[ttot]=inn;
    nto[ttot]=jnn;
    nlast[inn]=ttot;
}//建图
vector <int> vv[500005];
int num[600005],bn[600005],am[600005],br[600005];
int zhan[600005],tail=0;
bool iz[600005];
int rnum[600005],nnum[600005];
void tarjan(int u, int fa)
{
    if(dfn[u]) return;
    low[u] = dfn[u] = ++dep;
    zhan[++tail] = u;
    iz[u]=1;
    for(int i = llast[u]; i; i = nnext[i])
    {
        if(!visitt[i])
        {
            tarjan(tto[i],u);
            if(iz[tto[i]])
                low[u]=min(low[u],low[tto[i]]);
        }
    }
    if(dfn[u]==low[u])
    {
        ct++;
        while(zhan[tail+1]!=u)
        {
            vv[ct].push_back(zhan[tail]);
            iz[zhan[tail]]=0;
            bl[zhan[tail]]=ct;
            if(br[ct]>rnum[zhan[tail]])
            {
                br[ct]=rnum[zhan[tail]];
                bn[ct]=nnum[zhan[tail]];
            }
            if(bn[ct]>nnum[zhan[tail]])
                bn[ct]=nnum[zhan[tail]];
            color[zhan[tail--]]=ct;
        }
    }
}//经典tarjan
int n;
int ansa,ansb;
bool got[600005];
void dfs(int x)
{
    if(got[x]) return;
    got[x]=1;
    for(int i=nlast[x]; i; i=nxt[i])
    {
        dfs(nto[i]);
        if(br[x]>br[nto[i]])
        {
            br[x]=br[nto[i]];
            bn[x]=bn[nto[i]];
        }
        if(bn[x]>bn[nto[i]])
            bn[x]=bn[nto[i]];
    }
}
int rd[600005];
map <string,bool> apd;
map <string,int> apn;
int now=0;
string lw[600005];
signed main()
{
    memset(bn,127,sizeof(bn));
    memset(br,127,sizeof(br));
    string inn,jnn;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>inn;
        for(int j=0; j<inn.size(); j++)
        {
            if(inn[j]>'Z')
                inn[j]-=32;//全部转为大写
        }
        lw[i]=inn;//原论文备用
        if(!apd[inn])
        {
            apd[inn]=1;
            apn[inn]=++now;
            for(int j=0; j<inn.size(); j++)
                if(inn[j]=='R')
                    rnum[apn[inn]]++;
            nnum[apn[inn]]=inn.size();
        }
    }
    int m;
    cin>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>inn>>jnn;
        for(int j=0; j<inn.size(); j++)
            if(inn[j]>'Z')
                inn[j]-=32;//全部转为大写
        for(int j=0; j<jnn.size(); j++)
            if(jnn[j]>'Z')
                jnn[j]-=32;//全部转为大写
        if(!apd[inn])
        {
            apd[inn]=1;
            apn[inn]=++now;
            for(int j=0; j<inn.size(); j++)
                if(inn[j]=='R')
                    rnum[apn[inn]]++;
            nnum[apn[inn]]=inn.size();
        }
        if(!apd[jnn])
        {
            apd[jnn]=1;
            apn[jnn]=++now;
            for(int j=0; j<jnn.size(); j++)
                if(jnn[j]=='R')
                    rnum[apn[jnn]]++;
            nnum[apn[jnn]]=jnn.size();
        }
        add(apn[inn],apn[jnn]);
    }
    for(int i=1; i<=now; i++)
        if(!dfn[i])
            tarjan(i,0);
//    for(int i=1; i<=now; i++)
//        cout<<bn[bl[i]]<<" "<<br[bl[i]]<<endl;
    for(int i=1; i<=m; i++)
        if(bl[sta[i]]!=bl[tto[i]])
            nadd(bl[sta[i]],bl[tto[i]]);
    long long num=0;
    for(int i=1; i<=n; i++)
    {
        dfs(bl[apn[lw[i]]]);
        //cout<<br[bl[apn[lw[i]]]]<<" "<<bn[bl[apn[lw[i]]]]<<endl;
        ansa+=br[bl[apn[lw[i]]]];
        ansb+=bn[bl[apn[lw[i]]]];
    }
    cout<<ansa<<" "<<ansb;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...