Advertisement
Guest User

Ice Cream

a guest
Jan 21st, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. // dile a la jardinera que traigo flores
  2. // corner cases // int vs ll // cin vs scanf // clear structures // statement // doublesz
  3. #include <bits/stdc++.h>
  4. #define pb push_back
  5. #define sz(x) int(x.size())
  6. #define fill(x,v) memset(x,v,sizeof(x))
  7. #define REP(i,a,b) for(int i = int(a); i < int(b); ++i)
  8. #define trace(x) cout << #x << " = " << x << endl
  9. #define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  10. #define N 2048
  11. using namespace std;
  12. typedef long long ll;
  13. typedef pair<int,int> ii;
  14.  
  15. const ll INF = 1e15;
  16.  
  17. bool mayor(int a, int b, int k){
  18.     for(int i = 0; i < k; ++i){
  19.         if(!(a&(1<<i)) and b&(1<<i)) return false;
  20.     }
  21.     return true;
  22. }
  23.  
  24. struct Dinic{
  25.     int nodes,src,dst;
  26.     vector<int> dist,q,work;
  27.     struct edge{ int to, rev; ll f,cap;};
  28.     vector< vector<edge> > g;
  29.     Dinic(int x) : nodes(x), g(x), dist(x), q(x), work(x){}
  30.     void add_edge(int s, int t, ll cap){
  31.         g[s].pb((edge){t,sz(g[t]),0,cap});
  32.         g[t].pb((edge){s,sz(g[s])-1,0,0});
  33.     }
  34.     bool dinic_bfs(){
  35.         REP(i,0,sz(dist)) dist[i] = -1;
  36.         dist[src] = 0;
  37.         int qt = 0; q[qt++] = src;
  38.         for(int qh = 0; qh < qt; qh++){
  39.             int u = q[qh];
  40.             REP(i,0,sz(g[u])){
  41.                 edge &e = g[u][i]; int v = g[u][i].to;
  42.                 if(dist[v] < 0 && e.f < e.cap) dist[v] = dist[u] + 1, q[qt++] = v;
  43.             }
  44.         }
  45.         return dist[dst] >= 0;
  46.     }
  47.     ll dinic_dfs(int u, ll f){
  48.         if(u == dst) return f;
  49.         for(int &i = work[u]; i < sz(g[u]); ++i){
  50.             edge &e = g[u][i];
  51.             if(e.cap <= e.f) continue;
  52.             int v = e.to;
  53.             if(dist[v] == dist[u]+1){
  54.                 ll df = dinic_dfs(v,min(f,e.cap-e.f));
  55.                 if(df > 0){ e.f += df; g[v][e.rev].f -= df; return df; }
  56.             }
  57.         }
  58.         return 0;
  59.     }
  60.     ll max_flow(int _src, int _dst){
  61.         src = _src; dst = _dst;
  62.         ll result = 0;
  63.         while(dinic_bfs()){
  64.             REP(i,0,sz(work)) work[i] = 0;
  65.             while(ll delta = dinic_dfs(src,INF)) result += delta;
  66.         }
  67.         return result;
  68.     }
  69. };
  70.  
  71. int main(){
  72.  
  73.     fastio;
  74.     int n,k;
  75.     cin >> n >> k;
  76.     Dinic dinic(n+5);
  77.  
  78.     vector<int> f(n);
  79.     vector<int> vec(n);
  80.     for(int i = 0; i < n; ++i){
  81.         int x = 0,c;
  82.         for(int j = 0; j < k; ++j){
  83.             cin >> c;
  84.             if(c) x |= (1 << j);
  85.         }
  86.         vec[i] = x;
  87.         cin >> f[i];
  88.     }
  89.  
  90.     int s = n+1, t = n+2;
  91.     for(int i = 0; i < n; ++i){
  92.         if(f[i] == 0){
  93.             dinic.add_edge(s,i,1);
  94.         }else{
  95.             dinic.add_edge(i,t,1);
  96.         }
  97.     }
  98.  
  99.     for(int i = 0; i < n; ++i){
  100.         for(int j = 0; j < n; ++j){
  101.             if(f[i] == 0 and f[j] == 1 and mayor(vec[i],vec[j],k)){
  102.                 dinic.add_edge(i,j,1);
  103.             }
  104.         }
  105.     }
  106.  
  107.     vector<int> ans;
  108.     dinic.max_flow(s,t);
  109.     for(int i = 0; i < n; ++i){
  110.         if(dinic.dist[i] >= 0 and f[i] == 1) ans.pb(i+1);
  111.         else if(dinic.dist[i] < 0 and f[i] == 0) ans.pb(i+1);
  112.     }
  113.  
  114.     cout << sz(ans) << endl;
  115.     for(int x : ans) cout << x << " "; cout << endl;
  116.  
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement