the.one.liner's blog

By the.one.liner, history, 2 years ago, In English

What would be the time complexities of A -> 145542635 and B -> 145539763.

How to calculate time complexity when there are variable number of inserts, push_backs happening?

  • Vote: I like it
  • -1
  • Vote: I do not like it

| Write comment?
»
2 years ago, # |
  Vote: I like it +9 Vote: I do not like it

I don't know your algorithm but:

AC solution:

set<pair<int, int> > st;
...
st.erase({degree[nbr], nbr});
degree[nbr]--;
st.insert({degree[nbr], nbr});

set is red-black tree, so erase and insert both takes O(log|st|) time

TLE solution:

vector<int> graph[n+1];
...
graph[nbr].erase(find(graph[nbr].begin(), graph[nbr].end(), j));

vector just linear array, so find is just loop. It is O(|graph[nbr]|). erase is just shift all right-side elements + pop_back, it is too O(|graph[nbr]|)

»
2 years ago, # |
  Vote: I like it +9 Vote: I do not like it
for(int i : to_be_removed) {
    for(int nbr : graph[i]) {
        if(st.find({degree[nbr], nbr}) != st.end()) {
            st.erase({degree[nbr], nbr});
            degree[nbr]--;
            st.insert({degree[nbr], nbr});
        }
    }
}

Better rewrite to

for(int i : to_be_removed) {
    for(int nbr : graph[i]) {
        if(auto it = st.find({degree[nbr], nbr}); it != st.end()) { // start from C++ 17
            st.erase(it);
            degree[nbr]--;
            st.insert({degree[nbr], nbr});
        }
    }
}

Difference that in first version there are two searches for {degree[nbr], nbr}. In second version it is single search.