Submission #626048

#TimeUsernameProblemLanguageResultExecution timeMemory
626048Soul234Making Friends on Joitter is Fun (JOI20_joitter2)C++14
17 / 100
105 ms39252 KiB
#include<bits/stdc++.h> using namespace std; void DBG() { cerr << "]\n"; } template<class H, class... T> void DBG(H h, T... t) { cerr << h; if(sizeof...(t)) cerr << ", "; DBG(t...); } #ifdef LOCAL #define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__) #else #define dbg(...) 0 #endif // LOCAL #define FOR(i,a,b) for(int i = (a) ; i<(b) ; i++) #define F0R(i,a) FOR(i,0,a) #define ROF(i,a,b) for(int i = (b)-1 ; i>=(a) ; i--) #define R0F(i,a) ROF(i,0,a) #define each(e,a) for(auto &e : (a)) #define sz(v) (int)(v).size() #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define pb push_back #define tcT template<class T #define nl "\n" #define fi first #define se second #define ins insert using ll = long long; using vi = vector<int>; using pi = pair<int,int>; using str = string; tcT> using V = vector<T>; tcT> using pqg = priority_queue<T,vector<T>,greater<T>>; void setIO(string NAME = "") { cin.tie(0)->sync_with_stdio(0); if(sz(NAME)) { freopen((NAME + ".inp").c_str(),"r",stdin); freopen((NAME + ".out").c_str(),"w",stdout); } } tcT> bool ckmin(T&a, const T&b) { return b < a ? a=b,1 : 0; } tcT> bool ckmax(T&a, const T&b) { return b > a ? a=b,1 : 0; } const int MOD = 1e9 + 7; const int MX = 1e5+5; struct UF { int N; vi e; queue<pi> q; set<int> adj[MX], radj[MX], fl_ers[MX]; ll curans = 0; void init(int _N) { N = _N; e.assign(N + 1, -1); FOR(i, 1, N+1) { fl_ers[i].ins(i); } } int find(int x) { return e[x] < 0 ? x : e[x] = find(e[x]); } int get_size(int x) { return sz(adj[x]) + sz(radj[x]) + sz(fl_ers[x]); } void insFollow(int a, int b) { adj[a].ins(b); radj[b].ins(a); if(adj[b].count(a)) q.push({a, b}); } void join(int a, int b) { if(a == b) return; if(get_size(a) < get_size(b)) swap(a, b); curans += -1LL*e[a]*sz(fl_ers[b]) - 1LL*e[b]*sz(fl_ers[a]); e[a] += e[b]; e[b] = a; each(v, fl_ers[b]) { if(fl_ers[a].count(v)) curans += e[a]; else fl_ers[a].ins(v); } assert(adj[a].count(b) && adj[b].count(a)); assert(radj[a].count(b) && radj[b].count(a)); adj[a].erase(b); radj[a].erase(b); adj[b].erase(a); radj[b].erase(a); each(v, adj[b]) { assert(radj[v].count(b)); radj[v].erase(b); insFollow(a, v); } each(v, radj[b]) { assert(adj[v].count(b)); adj[v].erase(b); insFollow(v, a); } } void query_upd(int a, int b) { b = find(b); if(find(a) == b || fl_ers[b].count(a)) return; fl_ers[b].ins(a); curans -= e[b]; a = find(a); insFollow(a, b); while(!q.empty()) { tie(a, b) = q.front(); q.pop(); join(find(a), find(b)); } } }; int N, M; UF dsu; void solve() { cin >> N >> M; dsu.init(N+5); while(M-- > 0) { int a, b; cin >> a >> b; dsu.query_upd(a, b); cout << dsu.curans << nl; } } int main() { setIO(); int t=1; //cin>>t; while(t-->0) { solve(); } return 0; }

Compilation message (stderr)

joitter2.cpp: In function 'void setIO(std::string)':
joitter2.cpp:40:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   40 |         freopen((NAME + ".inp").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
joitter2.cpp:41:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |         freopen((NAME + ".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...