답안 #250466

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
250466 2020-07-18T04:45:43 Z rrrr10000 철인 이종 경기 (APIO18_duathlon) C++14
31 / 100
279 ms 34924 KB
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n)  for(long long i=0;i<(long long)(n);i++)
#define REP(i,k,n) for(long long i=k;i<(long long)(n);i++)
#define all(a) a.begin(),a.end()
#define pb emplace_back
#define eb emplace_back
#define lb(v,k) (lower_bound(all(v),k)-v.begin())
#define ub(v,k) (upper_bound(all(v),k)-v.begin())
#define fi first
#define se second
#define pi M_PI
#define PQ(T) priority_queue<T>
#define SPQ(T) priority_queue<T,vector<T>,greater<T>>
#define dame(a) {out(a);return 0;}
#define decimal cout<<fixed<<setprecision(15);
#define dupli(a) a.erase(unique(all(a)),a.end())
typedef long long ll;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> PP;
typedef tuple<ll,ll,ll,ll> PPP;
typedef multiset<ll> S;
using vi=vector<ll>;
using vvi=vector<vi>;
using vvvi=vector<vvi>;
using vvvvi=vector<vvvi>;
using vp=vector<P>;
using vvp=vector<vp>;
using vb=vector<bool>;
using vvb=vector<vb>;
const ll inf=1001001001001001001;
const ll INF=1001001001;
const ll mod=1000000007;
const double eps=1e-10;
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<class T> void out(T a){cout<<a<<'\n';}
template<class T> void outp(T a){cout<<'('<<a.fi<<','<<a.se<<')'<<'\n';}
template<class T> void outvp(T v){rep(i,v.size())cout<<'('<<v[i].fi<<','<<v[i].se<<')';cout<<'\n';}
template<class T> void outvvp(T v){rep(i,v.size())outvp(v[i]);}
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<'\n';}
template<class T> void outvv(T v){rep(i,v.size())outv(v[i]);}
template<class T> bool isin(T x,T l,T r){return (l)<=(x)&&(x)<=(r);}
template<class T> void yesno(T b){if(b)out("yes");else out("no");}
template<class T> void YesNo(T b){if(b)out("Yes");else out("No");}
template<class T> void YESNO(T b){if(b)out("YES");else out("NO");}
template<class T> void noyes(T b){if(b)out("no");else out("yes");}
template<class T> void NoYes(T b){if(b)out("No");else out("Yes");}
template<class T> void NOYES(T b){if(b)out("NO");else out("YES");}
void outs(ll a,ll b){if(a>=inf-100)out(b);else out(a);}
ll gcd(ll a,ll b){if(b==0)return a;return gcd(b,a%b);}
ll modpow(ll a,ll b){ll res=1;a%=mod;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}

vvp g;
vb used;
vi group;
ll ans=0;
void scan(int i){
    used[i]=true;
    group.pb(i);
    for(auto x:g[i])if(!used[x.fi])scan(x.fi);
}
ll c,ce;
vi gv,ge,lk,ord;
vb back_edge;
void dfs(int i,int p,int e){
    for(auto x:g[i]){
        if(x.fi!=p){
            if(ord[x.fi]==-1){
                ord[x.fi]=c++;
                dfs(x.fi,i,x.se);
                chmin(lk[i],lk[x.fi]);
            }
            else{
                chmin(lk[i],ord[x.fi]);
                back_edge[x.se]=true;
            }
        }
    }
}
void dfs1(int i,int p,int e){
    vp dl;
    for(auto x:g[i]){
        if(!back_edge[x.se]&&x.fi!=p){
            if(p!=-1){
                if(lk[x.fi]>=ord[i]){
                    gv[i]=-1;
                    ge[x.se]=ce++;
                    // cout<<i<<' '<<x.se<<' '<<ge[x.se]<<endl;
                }
                else ge[x.se]=ge[e];
                dfs1(x.fi,i,x.se);
            }
            else dl.pb(x);
        }
        else if(x.fi!=p&&ord[x.fi]<ord[i])ge[x.se]=ge[e];
    }
    if(p==-1){
        for(auto x:dl){
            ge[x.se]=ce++;
            dfs1(x.fi,i,x.se);
        }
        if(dl.size()==1)gv[i]=0;
        else gv[i]=-1;
    }
    else if(gv[i]==-2)gv[i]=ge[e];
}
vi f,sz,par;
vvi edge;
ll getsz(int i,int p){
    par[i]=p;
    if(i>=ce)sz[i]=1;
    else sz[i]=f[i];
    for(ll x:edge[i])if(x!=p){
        sz[i]+=getsz(x,i);
    }
    return sz[i];
}
int main(){
    ll n,m;cin>>n>>m;
    g=vvp(n);
    used=vb(n,false);
    rep(i,m){
        ll a,b;cin>>a>>b;a--;b--;
        g[a].pb(b,i);g[b].pb(a,i);
    }
    lk=vi(n,inf);
    gv=vi(n,-2);
    ge=vi(m);
    back_edge=vb(m,false);
    ord=vi(n,-1);
    rep(i,n){
        if(used[i])continue;
        group=vi(0);
        scan(i);
        if(group.size()<3)continue;
        ord[i]=0;
        c=1;
        ce=0;
        dfs(i,-1,-1);
        // outv(lk);outv(ord);
        dfs1(i,-1,-1);
        ll cnt=0;
        // outv(gv);outv(ge);
        f=vi(ce);
        for(ll x:group){
            if(gv[x]==-1)gv[x]=ce+(cnt++);
            else f[gv[x]]++;
        }
        edge=vvi(cnt+ce);
        for(ll x:group){
            if(gv[x]>=ce)for(auto to:g[x]){
                edge[gv[x]].pb(ge[to.se]);
                edge[ge[to.se]].pb(gv[x]);
            }
        }
        rep(j,cnt+ce)dupli(edge[j]);
        // out(ce);out(cnt);
        // out("edge");
        // outvv(edge);
        // outv(f);
        par=vi(ce+cnt);sz=vi(ce+cnt);
        getsz(0,-1);
        vi s(ce);
        rep(i,ce){
            for(ll x:edge[i])if(x!=par[i])s[i]+=sz[x]*(sz[x]-1);
            ans+=f[i]*((group.size()-1)*(group.size()-2)-s[i]);
            if(par[i]!=-1)ans-=f[i]*(group.size()-sz[i])*(group.size()-sz[i]-1);
            // outp(P(i,ans));
        }
        // outv(s);
        REP(i,ce,ce+cnt){
            ans+=(group.size()-1)*(group.size()-2);
            for(ll x:edge[i])if(x!=par[i])ans-=s[x];
            // out(ans);
            ll p=par[i];
            ans-=(s[p]+(group.size()-sz[p])*(group.size()-sz[p]-1)-sz[i]*(sz[i]-1));
            // outp(P(i,ans));
        }
    }
    out(ans);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 0 ms 256 KB Output is correct
5 Correct 1 ms 256 KB Output is correct
6 Correct 0 ms 256 KB Output is correct
7 Correct 1 ms 256 KB Output is correct
8 Incorrect 1 ms 256 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 0 ms 256 KB Output is correct
5 Correct 1 ms 256 KB Output is correct
6 Correct 0 ms 256 KB Output is correct
7 Correct 1 ms 256 KB Output is correct
8 Incorrect 1 ms 256 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 214 ms 26076 KB Output is correct
2 Correct 185 ms 25964 KB Output is correct
3 Correct 211 ms 26088 KB Output is correct
4 Correct 188 ms 25976 KB Output is correct
5 Correct 206 ms 21088 KB Output is correct
6 Correct 209 ms 24684 KB Output is correct
7 Correct 202 ms 17968 KB Output is correct
8 Correct 230 ms 20544 KB Output is correct
9 Correct 222 ms 14480 KB Output is correct
10 Correct 217 ms 15776 KB Output is correct
11 Correct 153 ms 10488 KB Output is correct
12 Correct 133 ms 10360 KB Output is correct
13 Correct 121 ms 9976 KB Output is correct
14 Correct 122 ms 9848 KB Output is correct
15 Correct 89 ms 8696 KB Output is correct
16 Correct 85 ms 8696 KB Output is correct
17 Correct 7 ms 5120 KB Output is correct
18 Correct 10 ms 4992 KB Output is correct
19 Correct 6 ms 4992 KB Output is correct
20 Correct 7 ms 5120 KB Output is correct
21 Correct 6 ms 4992 KB Output is correct
22 Correct 7 ms 4992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 512 KB Output is correct
2 Correct 2 ms 512 KB Output is correct
3 Correct 1 ms 512 KB Output is correct
4 Correct 2 ms 640 KB Output is correct
5 Correct 2 ms 640 KB Output is correct
6 Correct 2 ms 640 KB Output is correct
7 Correct 2 ms 640 KB Output is correct
8 Correct 2 ms 640 KB Output is correct
9 Correct 2 ms 640 KB Output is correct
10 Correct 2 ms 512 KB Output is correct
11 Correct 2 ms 512 KB Output is correct
12 Correct 1 ms 512 KB Output is correct
13 Correct 2 ms 512 KB Output is correct
14 Correct 2 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 1 ms 384 KB Output is correct
17 Correct 1 ms 512 KB Output is correct
18 Correct 1 ms 512 KB Output is correct
19 Correct 1 ms 512 KB Output is correct
20 Correct 1 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 188 ms 24624 KB Output is correct
2 Correct 188 ms 24684 KB Output is correct
3 Correct 189 ms 24556 KB Output is correct
4 Correct 186 ms 24556 KB Output is correct
5 Correct 186 ms 24448 KB Output is correct
6 Correct 226 ms 34924 KB Output is correct
7 Correct 242 ms 31208 KB Output is correct
8 Correct 216 ms 29548 KB Output is correct
9 Correct 221 ms 28016 KB Output is correct
10 Correct 190 ms 19644 KB Output is correct
11 Correct 229 ms 23020 KB Output is correct
12 Correct 219 ms 15704 KB Output is correct
13 Correct 207 ms 14732 KB Output is correct
14 Correct 157 ms 10616 KB Output is correct
15 Correct 132 ms 9976 KB Output is correct
16 Correct 88 ms 8440 KB Output is correct
17 Correct 130 ms 20840 KB Output is correct
18 Correct 133 ms 20832 KB Output is correct
19 Correct 136 ms 21072 KB Output is correct
20 Correct 140 ms 20812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 512 KB Output is correct
2 Correct 2 ms 512 KB Output is correct
3 Incorrect 2 ms 512 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 212 ms 24556 KB Output is correct
2 Correct 233 ms 25100 KB Output is correct
3 Incorrect 279 ms 24556 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 0 ms 256 KB Output is correct
5 Correct 1 ms 256 KB Output is correct
6 Correct 0 ms 256 KB Output is correct
7 Correct 1 ms 256 KB Output is correct
8 Incorrect 1 ms 256 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
3 Correct 0 ms 256 KB Output is correct
4 Correct 0 ms 256 KB Output is correct
5 Correct 1 ms 256 KB Output is correct
6 Correct 0 ms 256 KB Output is correct
7 Correct 1 ms 256 KB Output is correct
8 Incorrect 1 ms 256 KB Output isn't correct
9 Halted 0 ms 0 KB -