FHVirus

Counting Triangles Ugly

Jun 17th, 2021
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. // Knapsack DP is harder than FFT.
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
  5. #define ff first
  6. #define ss second
  7. #define pb emplace_back
  8. #define AI(x) begin(x),end(x)
  9. template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
  10. template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;}
  11. #ifdef OWO
  12. #define debug(args...) SDF(#args, args)
  13. #define OIU(args...) ostream& operator<<(ostream&O,args)
  14. #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;}
  15. LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss)
  16. template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));}
  17. template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';}
  18. #else
  19. #pragma GCC optimize("Ofast")
  20. #define debug(...) ((void)0)
  21. #endif
  22.  
  23. const int N = 100001;
  24. int n, m;
  25. int deg[N];
  26. vector<int> adj[N];
  27. vector<pii> edges;
  28. map<int, bitset<N>> jizz;
  29.  
  30.  
  31. signed main(){
  32.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  33.     cin >> n >> m;
  34.     for(int u, v, i = 0; i < m; ++i){
  35.         cin >> u >> v;
  36.         adj[u].pb(v); adj[v].pb(u);
  37.         ++deg[u], ++deg[v];
  38.         edges.pb(u, v);
  39.     }
  40.  
  41.     int k = ceil(sqrt(m));
  42.     for(int i = 0; i < n; ++i){
  43.         if(deg[i] <= k) sort(AI(adj[i]));
  44.         else{
  45.             jizz[i] = bitset<N>();
  46.             for(int j: adj[i]) jizz[i][j] = true;
  47.         }
  48.     }
  49.  
  50.     int ans = 0;
  51.     for(auto [u, v]: edges){
  52.         if(deg[u] > deg[v]) swap(u, v);
  53.         if(deg[u] <= k and deg[v] <= k){
  54.             int i = 0, j = 0;
  55.             while(i < deg[u] and j < deg[v]){
  56.                 if(adj[u][i] == adj[v][j]) ++i, ++j, ++ans;
  57.                 else if(adj[u][i] < adj[v][j]) ++i;
  58.                 else ++j;
  59.             }
  60.         } else {
  61.             for(int w: adj[u]) if(jizz[v][w]) ++ans;
  62.         }
  63.     }
  64.     cout << ans / 3 << '\n';
  65.  
  66.     return 0;
  67. }
Add Comment
Please, Sign In to add comment