Guest User

Untitled

a guest
May 23rd, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5. using namespace std;
  6.  
  7. long long n,m;
  8. vector <vector <int> > G;
  9. vector <pair<int,int> > M;
  10.  
  11. int dsu_parent[5000];
  12. int dsu_rank[5000];
  13. int size_of_component[5000];
  14. int edges_of_component[5000];
  15. set <int> all_components;
  16. long long C[5001][5001];
  17. long long answer_one=0,answer_two=0,answer_three=0,answer_four=0;
  18. long long real_answer=0;
  19. int MAXN=5000;
  20.  
  21. ostream & operator<<(ostream &stream, vector <int> &A){
  22.     for (int i=0;i<A.size();i++)
  23.         cout<<A[i]<<" ";
  24.     return stream;
  25. }
  26.  
  27. int dsu_make(int i){
  28.     dsu_parent[i]=i;
  29.     dsu_rank[i]=0;
  30. }
  31.  
  32. void pascal_init(){
  33.     for (int i=0;i<=n;i++)
  34.         C[i][i]=1,C[i][1]=i;
  35.     for (int i=2;i<=n;i++)
  36.     for (int j=2;j<=n-1;j++){
  37.         C[i][j]=C[i-1][j-1]+C[i-1][j];
  38.         //cout<<C[i][j]<<" "<<endl;
  39.     }
  40.     real_answer=C[n][1]+C[n][2]+C[n][3]+C[n][4];
  41. }
  42.  
  43. int dsu_find(int i){
  44.     if (i==dsu_parent[i])
  45.         return i;
  46.     return dsu_parent[i]=dsu_find(dsu_parent[i]);
  47. }
  48.  
  49. void dsu_unite(int a, int b){
  50.     a=dsu_find(a);
  51.     b=dsu_find(b);
  52.     if (a!=b){
  53.         if (dsu_rank[a]<dsu_rank[b])
  54.             swap(a,b);
  55.         dsu_parent[b]=a;
  56.         size_of_component[a]+=size_of_component[b];
  57.         edges_of_component[a]+=edges_of_component[b];
  58.         all_components.erase(b);
  59.         if (dsu_rank[a]==dsu_rank[b])
  60.             dsu_rank[a]++;
  61.     }
  62. }
  63.  
  64. void iterat_for_three(int numb){
  65.     //cout<<"ENTEROFTHREE"<<endl;
  66.     int u=M[numb].first; int v=M[numb].second;
  67.     long long k1=G[u].size();
  68.     long long k2=G[v].size();
  69.     sort (G[u].begin(),G[u].end());
  70.     sort (G[v].begin(),G[v].end());
  71.     vector<int> intersect_of_lists(G[u].size()+G[v].size());
  72.     vector<int>::iterator ite=set_intersection(G[u].begin(),G[u].end(),G[v].begin(),G[v].end(),intersect_of_lists.begin());
  73.     long long e=ite-intersect_of_lists.begin();
  74.     long long answer=(n-2)-k1-k2+e;
  75.     answer_three+=answer;
  76.     //cout<<"EXITOFTHREE"<<endl;
  77. }
  78.  
  79. void iterat_for_four(int numb){
  80.     long long answer=0;
  81.     int u=M[numb].first;
  82.     int v=M[numb].second;
  83.     int u_comp=dsu_find(u); int v_comp=dsu_find(v);
  84.     int part_sums[5001]={};
  85.     int local_size[5001]={};
  86.     int k=0;
  87.     for (set<int>::iterator it=all_components.begin();it!=all_components.end();it++,k++){
  88.         if (k) part_sums[k]+=part_sums[k-1];
  89.         int cur=*it;
  90.         if (cur!=u_comp && cur!=v_comp){
  91.             part_sums[k]+=size_of_component[k];
  92.             local_size[k]=size_of_component[k];
  93.             answer+=(size_of_component[cur]*(size_of_component[cur]-1))/2-edges_of_component[cur];
  94.         }
  95.     }
  96.    
  97.     for (int i=0;i<k;i++){
  98.         long long cur_part_sum=0;
  99.         cur_part_sum=part_sums[k-1];
  100.         if (i) cur_part_sum-=part_sums[i-1];
  101.         answer+=local_size[k]*cur_part_sum;
  102.     }
  103.    
  104.    
  105.    
  106.     answer_four+=answer;
  107.     dsu_unite(u,v);
  108.     u_comp=dsu_find(u);
  109.     G[u].push_back(v);
  110.     G[v].push_back(u);
  111.     edges_of_component[u_comp]++;
  112.     //cout<<"EXIT"<<endl;
  113. }
  114.  
  115. int main(){
  116.     cin>>n>>m;
  117.     G.resize(n);
  118.     M.resize(m);
  119.     answer_one=0; answer_two=m;
  120.     for (int i=0;i<m;i++){
  121.         int a,b; cin>>a>>b;
  122.         a--; b--;
  123.         if (a>b) swap(a,b);
  124.         M[i]=(make_pair(a,b));
  125.     }
  126.     for (int i=0;i<n;i++){
  127.         dsu_make(i);
  128.         size_of_component[i]=1;
  129.         all_components.insert(i);
  130.     }
  131.     for (int i=0;i<m;i++){
  132.         iterat_for_three(i);
  133.         iterat_for_four(i);
  134.     }
  135.     pascal_init();
  136.     cout<<C[n][4]-answer_four<<" "<<C[n][3]-answer_three<<" "<<real_answer<<endl;
  137.     cout<<real_answer-answer_one-answer_two-answer_three-answer_four<<endl;
  138.     return 0;
  139. }
Add Comment
Please, Sign In to add comment