Submission #422733

#TimeUsernameProblemLanguageResultExecution timeMemory
422733amunduzbaevMaking Friends on Joitter is Fun (JOI20_joitter2)C++14
100 / 100
1327 ms79084 KiB
/* made by amunduzbaev */ //~ #include <ext/pb_ds/assoc_container.hpp> //~ #include <ext/pb_ds/tree_policy.hpp> #include "bits/stdc++.h" using namespace std; //~ using namespace __gnu_pbds; #define ff first #define ss second #define pb push_back #define mp make_pair #define ub upper_bound #define lb lower_bound #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(),x.rend() #define NeedForSpeed ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define vv vector #define mem(arr, v) memset(arr, v, sizeof arr) #define int long long typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef vector<int> vii; typedef vector<pii> vpii; template<class T> bool umin(T& a, const T& b) { return a > b ? a = b, true : false; } template<class T> bool umax(T& a, const T& b) { return a < b ? a = b, true : false; } template<int sz> using tut = array<int, sz>; void usaco(string s) { freopen((s+".in").c_str(),"r",stdin); freopen((s+".out").c_str(),"w",stdout); NeedForSpeed } //~ template<class T> using oset = tree<T, //~ null_type, less_equal<T>, rb_tree_tag, //~ tree_order_statistics_node_update> ordered_set; const int N = 2e5+5; const int mod = 1e9+7; const ll inf = 1e18; const ld Pi = acos(-1); #define MULTI 0 int n, m, k, s, t, q, ans, res, a[N]; int par[N], sz[N]; set<int> in[N], tocomp[N], fromcomp[N]; queue<pii> qq; void add(int a, int b){ tocomp[a].insert(b), fromcomp[b].insert(a); if(tocomp[b].count(a) && fromcomp[a].count(b)) qq.push({a, b}); } int f(int x) { return (x == par[x] ? x : par[x] = f(par[x])); } void merge(int a, int b){ a = f(a), b = f(b); if(a == b) return; if(sz(in[a]) + sz(tocomp[a]) + sz(fromcomp[a]) < sz(in[b]) + sz(tocomp[b]) + sz(fromcomp[b])) swap(a, b); res += (sz(in[a]) * sz[b] + sz(in[b]) * sz[a]); par[b] = a, sz[a] += sz[b]; for(auto x : in[b]){ if(in[a].count(x)) res -= sz[a]; else in[a].insert(x); } tocomp[a].erase(b), fromcomp[a].erase(b); tocomp[b].erase(a), fromcomp[b].erase(a); for(auto x : tocomp[b]){ fromcomp[x].erase(b); add(a, f(x)); } for(auto x : fromcomp[b]){ tocomp[x].erase(b); add(f(x), a); } tocomp[b].clear(), fromcomp[b].clear(), in[b].clear(); } void solve(int t_case){ cin>>n>>m; for(int i=1;i<=n;i++) in[i].insert(i), par[i] = i, sz[i] = 1; while(m--){ int a, b; cin>>a>>b; if(f(a) == f(b) || in[f(b)].count(a)){ cout<<res<<"\n"; continue; } in[f(b)].insert(a); res += sz[f(b)]; add(f(a), f(b)); while(!qq.empty()){ int a = qq.front().ff, b = qq.front().ss; qq.pop(); merge(a, b); } cout<<res<<"\n"; } } signed main(){ NeedForSpeed if(MULTI){ int t; cin>>t; for(int t_case = 1; t_case <= t; t_case++) solve(t_case); } else solve(1); return 0; }

Compilation message (stderr)

joitter2.cpp: In function 'void usaco(std::string)':
joitter2.cpp:32:31: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 | void usaco(string s) { freopen((s+".in").c_str(),"r",stdin);
      |                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
joitter2.cpp:33:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   33 |  freopen((s+".out").c_str(),"w",stdout); NeedForSpeed }
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...