제출 #212105

#제출 시각아이디문제언어결과실행 시간메모리
212105kshitij_sodani조이터에서 친구를 만드는건 재밌어 (JOI20_joitter2)C++17
100 / 100
651 ms53508 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long ll; #define mp make_pair #define pb push_back #define a first #define b second #define endl "\n" ll par[100001]; ll size2[100001]; set<pair<ll,ll>> inc[100001]; set<pair<ll,ll>> out[100001]; ll find(ll no){ if(par[no]==no){ return no; } par[no]=find(par[no]); return par[no]; } set<ll> wait; ll ans=0; ll count(ll aa){ return (ll)size2[aa]*(size2[aa]-1)+(ll)inc[aa].size()*size2[aa]; } void merge(ll aa,ll bb){ ans-=(count(aa)+count(bb)); if((inc[aa].size()+out[aa].size())<(inc[bb].size()+out[bb].size())){ swap(aa,bb); } for(auto no:inc[bb]){ if(no.a==aa){ auto it=out[aa].find({bb,no.b}); out[aa].erase(it); continue; } auto it=inc[no.a].lower_bound({aa,0}); if(it!=inc[no.a].end() and it->a==aa){ wait.insert(no.a); } out[no.a].insert({aa,no.b}); auto tt=out[no.a].find({bb,no.b}); out[no.a].erase(tt); inc[aa].insert(no); } for(auto no:out[bb]){ if(no.a==aa){ auto it=inc[aa].find({bb,no.b}); inc[aa].erase(it); continue; } auto it=out[no.a].lower_bound({aa,0}); if(it!=out[no.a].end() and it->a==aa){ wait.insert(no.a); } inc[no.a].insert({aa,no.b}); auto tt=inc[no.a].find({bb,no.b}); inc[no.a].erase(tt); out[aa].insert(no); } inc[bb].clear(); out[bb].clear(); par[bb]=aa; size2[aa]+=size2[bb]; ans+=count(aa); //cout<<":: "<<ans<<" "<<aa<<" "<<bb<<" "<<inc[aa].size()<<endl; if(wait.size()>0){ ll xx=*(wait.begin()); wait.erase(wait.begin()); merge(aa,xx); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); ll tot=0; ll n,m; cin>>n>>m; for(ll i=0;i<n;i++){ par[i]=i; size2[i]=1; } ll aa,bb; for(ll i=0;i<m;i++){ cin>>aa>>bb; aa-=1; bb-=1; ll ac=aa; aa=find(aa); bb=find(bb); if(aa==bb){ cout<<ans<<endl; continue; } if(out[aa].find({bb,ac})==out[aa].end()){ auto it=inc[aa].lower_bound({bb,0}); if(it!=inc[aa].end() and it->a==bb){ merge(aa,bb); } else{ inc[bb].insert({aa,ac}); out[aa].insert({bb,ac}); ans+=size2[bb]; } } cout<<ans<<endl; } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

joitter2.cpp: In function 'int main()':
joitter2.cpp:79:5: warning: unused variable 'tot' [-Wunused-variable]
  ll tot=0;
     ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...