Submission #353894


Source Code Expand

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <climits>
using namespace std;

#define REP(i,n) for(int i=0; i<(int)(n); i++)
#define RREP(i,n) for(int i=(int)n-1; i>=0; i--)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();++i)
#define ALL(c) (c).begin(), (c).end()

typedef long long int ll;
typedef pair<int, int> pii;
typedef pair<int, pair<int, int> > pipii;
typedef vector<int> vi;

const int INF = 1e9;
const int MOD = 1e9+7;

struct UnionFind {
    vector<int> data;
    UnionFind(int size) : data(size, -1) { }
    bool unionSet(int x, int y) {
        x = root(x); y = root(y);
        if (x != y) {
            if (data[y] < data[x]) swap(x, y);
            data[x] += data[y]; data[y] = x;
        }
        return x != y;
    }
    bool findSet(int x, int y) {
        return root(x) == root(y);
    }
    int root(int x) {
        return data[x] < 0 ? x : data[x] = root(data[x]);
    }
    int size(int x) {
        return -data[root(x)];
    }
};
typedef int Weight;
struct Edge{
    int src,dst;
    Weight weight;
    int rev;
    Edge(int f, int t, Weight c=1, int rev=0):src(f),dst(t),weight(c),rev(rev){}
    bool operator < (const Edge& re)const{ return weight > re.weight;}
};
typedef vector< vector<Edge> > Graph;
void add_edge(Graph &G, int s, int t, Weight cap){
    G[s].push_back(Edge(s, t, cap, G[t].size()));
    G[t].push_back(Edge(t, s, cap, G[s].size()-1));
}
typedef vector<Edge> Edges;
pair<Weight, Edges> minimumSpanningForest(const Graph &g) {
    int n = g.size();
    UnionFind uf(n);
    priority_queue<Edge> Q;
    REP(u, n) FOR(e, g[u]) if (u < e->dst) Q.push(*e);
    Weight total = 0;
    Edges F;
    while (F.size() < n-1 && !Q.empty()) {
        Edge e = Q.top(); Q.pop();
        if (uf.unionSet(e.src, e.dst)) {
            F.push_back(e);
            total += e.weight;
        }
    }
    return pair<Weight, Edges>(total, F);
}

int dfs(int pre, int v, vector<vi> &g, vi &even, vi &evennum){
    int res = 0;
    if(even[v]) res++;
    if(pre != -1 && g[v].size() == 1) return res;
    FOR(e, g[v]){
        if((*e) == pre) continue;
        res += dfs(v, *e, g, even, evennum);
    }
    evennum[v] = res;
    return res;
}



int main(void){
    int N, M;
    cin >> N >> M;
    vector<pii> e;
    vector<ll> cost(M, 2);
    for(int i = 1; i < M; i++) (cost[i] = cost[i-1] * 2) %= MOD;
    ll ans = 0LL;
    vi even(N, 0);
    Graph g(N);
    REP(i, M){
        int a, b;
        cin >> a >> b;
        a--; b--;
        e.push_back(make_pair(a, b));
        even[a]++; even[b]++;
        ans = (ans + cost[i]) % MOD;
        add_edge(g, a, b, i);
    }
    REP(i, N) even[i] %= 2; 
    pair<Weight, Edges> msf = minimumSpanningForest(g);
    
    int evensum = 0;
    Edges es = msf.second;
    vi evennum(N, 0);
    vector<vi> gs(N);
    FOR(e, es){
        int x = (*e).src, y = (*e).dst;
        gs[x].push_back(y);
        gs[y].push_back(x);
    }
    
    evensum = dfs(-1, 0, gs, even, evennum);
    RREP(i, es.size()){
        //cout << es[i].src << "*" << es[i].dst << ":" << es[i].weight << endl;
        int x = es[i].src, y = es[i].dst;
        int k = min(evennum[x], evennum[y]);
        if(k % 2 == 1 || (evensum - k) % 2 == 1){
            ans = (ans + cost[es[i].weight]) % MOD;
        }
    }
    cout << ans << endl;
    return 0;
}

Submission Info

Submission Time
Task C - ドライブ
User no15_renne
Language C++ (G++ 4.6.4)
Score 0
Code Size 3685 Byte
Status WA
Exec Time 1843 ms
Memory 94040 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 0 / 40 0 / 70
Status
AC × 2
AC × 4
WA × 16
AC × 2
WA × 31
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
Subtask1 sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt
Subtask2 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask2_13.txt, subtask2_14.txt, subtask2_15.txt
Case Name Status Exec Time Memory
sample_01.txt AC 169 ms 1112 KB
sample_02.txt AC 31 ms 1048 KB
subtask1_01.txt WA 35 ms 1100 KB
subtask1_02.txt AC 31 ms 1096 KB
subtask1_03.txt WA 33 ms 1108 KB
subtask1_04.txt WA 38 ms 1472 KB
subtask1_05.txt WA 35 ms 1496 KB
subtask1_06.txt WA 36 ms 1440 KB
subtask1_07.txt WA 36 ms 1464 KB
subtask1_08.txt WA 37 ms 1468 KB
subtask1_09.txt WA 37 ms 1436 KB
subtask1_10.txt WA 36 ms 1552 KB
subtask1_11.txt WA 37 ms 1556 KB
subtask1_12.txt WA 37 ms 1472 KB
subtask1_13.txt WA 39 ms 1812 KB
subtask1_14.txt WA 38 ms 1364 KB
subtask1_15.txt WA 35 ms 1176 KB
subtask1_16.txt WA 41 ms 1500 KB
subtask1_17.txt WA 37 ms 1360 KB
subtask1_18.txt AC 37 ms 1384 KB
subtask2_01.txt WA 1843 ms 80668 KB
subtask2_02.txt WA 1767 ms 80804 KB
subtask2_03.txt WA 1457 ms 79540 KB
subtask2_04.txt WA 1803 ms 80840 KB
subtask2_05.txt WA 1581 ms 74716 KB
subtask2_06.txt WA 1480 ms 75240 KB
subtask2_07.txt WA 1186 ms 74588 KB
subtask2_08.txt WA 1708 ms 94040 KB
subtask2_09.txt WA 1760 ms 79948 KB
subtask2_10.txt WA 363 ms 19360 KB
subtask2_11.txt WA 492 ms 29952 KB
subtask2_12.txt WA 1365 ms 58464 KB
subtask2_13.txt WA 1514 ms 69200 KB
subtask2_14.txt WA 1623 ms 75396 KB
subtask2_15.txt WA 546 ms 34644 KB