답안 #710309

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
710309 2023-03-15T06:59:27 Z vjudge1 철인 이종 경기 (APIO18_duathlon) C++17
31 / 100
146 ms 29556 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 10;
int n,m;
vector <int> adj[maxn];
stack <int> st;
int l[maxn],t[maxn],cnt,scc,id[maxn];
int dp[maxn],dp2[maxn],s[maxn];
vector <int> adj2[maxn];
int ans = 0LL;
bool dau[maxn];
void dfs(int x, int p)
{
    st.push(x);
    l[x] = t[x] = ++cnt;
    for (int i:adj[x])
        if (i!=p)
    {
        if (!t[i])
        {
            dfs(i,x);
            l[x]=min(l[x],l[i]);
        }
        else l[x]=min(l[x],t[i]);
    }
    if (l[x]==t[x])
    {
        scc++; int temp;
        do
        {
            temp = st.top(); st.pop();
            s[scc]++;
            id[temp] = scc;
        }
        while (temp!=x);
    }
}

void dfs2(int x, int p)
{
    dp[x] = 0;
    for (int i:adj2[x])
        if (i!=p)
    {
        dfs2(i,x);
//        cout<<temp<<" : "<<dp[i]+s[i]<<' '<<s[x]<<endl;
        dp[x] = (dp[x] + dp[i] + s[i]) ;
    }
}

void dfs3(int x, int p, int val)
{
    dp2[x] = val;
//    cout<<val<<" : "<<temp<<" : "<<s[x]<<endl;
    vector <int> pre,suf;
    for (int i:adj2[x])
        if (i!=p)
    {
        pre.push_back((dp[i]+s[i]) );
        suf.push_back((dp[i]+s[i]) );
    }
    val = (val + s[x]) ;
//    cout<<x<<" :: "<<val<<endl;
//    for (int i:pre) cout<<i<<' '; cout<<"@@@@@@@@@@@"<<endl;
//    for (int i:suf) cout<<i<<' '; cout<<"@@@@@@@@@@@"<<endl;
    for (int i=1; i<pre.size(); i++) pre[i] = (pre[i-1] + pre[i]) ;
    for (int i=suf.size()-2; i>=0; i--) suf[i] = (suf[i+1] + suf[i]) ;
//    cout<<(int)suf.size()<<"@%$@%#$@"<<endl;
    int cnt2=0;
    for (int i:adj2[x])
        if (i!=p)
        {
            int val2 = val;
//            cerr<<val2<<' '<<cnt2<<" -> ";
            if (cnt2>0) val2 = (val2 + pre[cnt2-1]) ;
            if (cnt2<=(int)suf.size()-2) val2 = (val2 + suf[cnt2+1]) ;
//             cerr<<val<<endl;
            cnt2++;
            dfs3(i,x,val2);
        }
}
void dfs4(int x, int p, int sz)
{
    int val = dp2[x];
    int temp = (sz - s[x] - val);
    if (temp>0&&val>0)
    ans += s[x]*val*temp;
    for (int i:adj2[x])
        if (i!=p)
    {
        dfs4(i,x,sz);
        val = dp[i]+s[i];
        temp = sz - s[x] - val;
        if (temp>0&&val>0) ans+=s[x]*val*temp;
    }
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
//    freopen("dualthon.inp","r",stdin);
//    freopen("dualthon.ans","w",stdout);
    cin>>n>>m;
    for (int i=1; i<=m; i++)
    {
        int u,v; cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    cnt = scc= 0;
    vector <int> root;
    for (int i=1; i<=n; i++) if (!t[i]) dfs(i,i), root.push_back(id[i]);
    for (int i=1; i<=n; i++)
        for (int j:adj[i])
            if (id[i]!=id[j])
    {
        adj2[id[i]].push_back(id[j]);
    }
    for (int i=1; i<=scc; i++)
    {
        sort(adj2[i].begin(),adj2[i].end());
        adj2[i].resize(unique(adj2[i].begin(),adj2[i].end())-adj2[i].begin());
    }
    for (int i:root) dfs2(i,i);
    for (int i:root) dfs3(i,i,0);
    for (int i=1; i<=scc; i++)
    {
        int sl = s[i];
//        cout<<i<<" := "<<dp[i]<<' '<<dp2[i]<<endl;
        int temp = 0;
        if (sl>=3)
        {
            temp = sl*(sl-1)*(sl-2);
            ans = (ans + temp);
        }
        if (sl>=2)
        {
            temp = (sl-1)*(sl-1);
//            cout<<temp<<" "<<dp[i]<<' '<<dp2[i]<<endl;
            ans += temp*dp[i]*2;
            ans += temp*dp2[i]*2;
        }
    }
    for (int i:root) dfs4(i,i,dp[i]+s[i]);
    cout<<ans<<'\n';
}

Compilation message

count_triplets.cpp: In function 'void dfs3(long long int, long long int, long long int)':
count_triplets.cpp:68:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for (int i=1; i<pre.size(); i++) pre[i] = (pre[i-1] + pre[i]) ;
      |                   ~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 4 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Incorrect 4 ms 4948 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 4 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Incorrect 4 ms 4948 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 17508 KB Output is correct
2 Correct 51 ms 17488 KB Output is correct
3 Correct 80 ms 23508 KB Output is correct
4 Correct 67 ms 17484 KB Output is correct
5 Correct 72 ms 18928 KB Output is correct
6 Correct 91 ms 21868 KB Output is correct
7 Correct 75 ms 18628 KB Output is correct
8 Correct 84 ms 19392 KB Output is correct
9 Correct 90 ms 16272 KB Output is correct
10 Correct 78 ms 16644 KB Output is correct
11 Correct 54 ms 13832 KB Output is correct
12 Correct 72 ms 13628 KB Output is correct
13 Correct 65 ms 14044 KB Output is correct
14 Correct 55 ms 13780 KB Output is correct
15 Correct 47 ms 14148 KB Output is correct
16 Correct 46 ms 13724 KB Output is correct
17 Correct 8 ms 10576 KB Output is correct
18 Correct 10 ms 10704 KB Output is correct
19 Correct 8 ms 10608 KB Output is correct
20 Correct 8 ms 10572 KB Output is correct
21 Correct 9 ms 10636 KB Output is correct
22 Correct 8 ms 10636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5076 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 4 ms 5076 KB Output is correct
4 Correct 3 ms 5332 KB Output is correct
5 Correct 3 ms 5204 KB Output is correct
6 Correct 3 ms 5204 KB Output is correct
7 Correct 3 ms 5204 KB Output is correct
8 Correct 4 ms 5204 KB Output is correct
9 Correct 3 ms 5204 KB Output is correct
10 Correct 4 ms 5140 KB Output is correct
11 Correct 3 ms 5076 KB Output is correct
12 Correct 4 ms 5076 KB Output is correct
13 Correct 3 ms 5076 KB Output is correct
14 Correct 3 ms 5076 KB Output is correct
15 Correct 3 ms 5076 KB Output is correct
16 Correct 3 ms 5076 KB Output is correct
17 Correct 3 ms 5204 KB Output is correct
18 Correct 3 ms 5204 KB Output is correct
19 Correct 3 ms 5204 KB Output is correct
20 Correct 3 ms 5204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 89 ms 17160 KB Output is correct
2 Correct 82 ms 17100 KB Output is correct
3 Correct 90 ms 17108 KB Output is correct
4 Correct 109 ms 17120 KB Output is correct
5 Correct 97 ms 17168 KB Output is correct
6 Correct 139 ms 29556 KB Output is correct
7 Correct 146 ms 25860 KB Output is correct
8 Correct 131 ms 23580 KB Output is correct
9 Correct 103 ms 21436 KB Output is correct
10 Correct 82 ms 17316 KB Output is correct
11 Correct 116 ms 17172 KB Output is correct
12 Correct 78 ms 17112 KB Output is correct
13 Correct 75 ms 17100 KB Output is correct
14 Correct 73 ms 16832 KB Output is correct
15 Correct 83 ms 16428 KB Output is correct
16 Correct 67 ms 14900 KB Output is correct
17 Correct 74 ms 19212 KB Output is correct
18 Correct 70 ms 19588 KB Output is correct
19 Correct 70 ms 20088 KB Output is correct
20 Correct 63 ms 19076 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5076 KB Output is correct
2 Correct 4 ms 5076 KB Output is correct
3 Incorrect 4 ms 5076 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 129 ms 17080 KB Output is correct
2 Correct 110 ms 16912 KB Output is correct
3 Incorrect 107 ms 15200 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 4 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Incorrect 4 ms 4948 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 4 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Incorrect 4 ms 4948 KB Output isn't correct
8 Halted 0 ms 0 KB -