| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 878585 | MasterTaster | Paths (BOI18_paths) | C++14 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#define ll long long
#define pii pair<int, int>
#define xx first
#define yy second
#define pb push_back
#define MAXN 300010
#define MAXK 8
using namespace std;
int n, m, k, a[MAXN];
ll cnt[MAXN][MAXK], ress, cntt[MAXN][MAXK][MAXK];
vector<pii> grane;
vector<int> g[MAXN];
int main() {
    cin>>n>>m>>k;
    for (int i=1; i<=n; i++)
        cin>>a[i];
    for (int i=0; i<m; i++)
    {
        int u, v; cin>>u>>v;
        grane.pb({u, v});
        g[u].pb(v); g[v].pb(u);
        cnt[u][a[v]]++;
        cnt[v][a[u]]++;
    }
    for (auto par:grane)
    {
        int u=par.xx, v=par.yy;
        if (a[u]==a[v]) continue;
        ress+=2;
        vector<int> boje;
        for (int i=1; i<=5; i++) if (a[u]!=i && a[v]!=i) boje.pb(i);
        int c1, c2, c3;
        c1=boje[0]; c2=boje[1]; c3=boje[2];
        ress+=2*((cnt[u][c1]*cnt[v][c2])+(cnt[u][c2]*cnt[v][c1]) + (cnt[u][c1]*cnt[v][c3])+(cnt[u][c3]*cnt[v][c1]) + (cnt[u][c3]*cnt[v][c2])+(cnt[u][c2]*cnt[v][c3]))
                +cnt[u][c1]+cnt[u][c2]+cnt[u][c3]+cnt[v][c1]+cnt[v][c2]+cnt[v][c3];
        //cout<<u<<" "<<v<<" "<<ress<<endl;
    }
    for (int u=1; u<=n; u++)
    {
        for (auto v:g[u])
        {
            if (a[u]==a[v]) continue;
            vector<int> boje;
            for (int i=1; i<=5; i++)
                if (a[u]!=i && a[v]!=i) boje.pb(i);
            for (auto c:boje)
                cntt[u][a[v]][c]+=cnt[v][c];
        }
    }
    ll press=0;
    for (int u=1; u<=n; u++)
    {
        vector<int> boje;
        for (int i=1; i<=5; i++) if (a[u]!=i) boje.pb(i);
        for (int i=0; i<boje.size(); i++)
        {
            for (int j=0; j<boje.size(); j++)
            {
                if (i==j) continue;
                int c1=boje[i], c2=boje[j], c3=-1, c4=-1;
                for (int k=0; k<boje.size(); k++) { if (k!=i && k!=j) { if (c3==-1) c3=boje[k]; else c4=boje[k]; } }
                press+=(cntt[u][c1][c2]*cntt[u][c3][c4]+cntt[u][c1][c2]*cntt[u][c4][c3]);
                //cout<<u<<" "<<" "<<c1<<" "<<c2<<" "<<c3<<" "<<c4<<": "<<press<<endl;
            }
        }
    }
    if (press%2==1) assert(0);
    press/=2;
    ress+=press;
    //cout<<press<<endl;
    cout<<ress;
}
/*
8 7 5
1 2 3 1 4 5 5 4
1 2
2 3
3 4
2 5
5 6
2 7
7 8
 */
