Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // dile a la jardinera que traigo flores
- // corner cases // int vs ll // cin vs scanf // clear structures // statement // doublesz
- #include <bits/stdc++.h>
- #define pb push_back
- #define sz(x) int(x.size())
- #define fill(x,v) memset(x,v,sizeof(x))
- #define REP(i,a,b) for(int i = int(a); i < int(b); ++i)
- #define trace(x) cout << #x << " = " << x << endl
- #define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
- #define N 2048
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> ii;
- const ll INF = 1e15;
- bool mayor(int a, int b, int k){
- for(int i = 0; i < k; ++i){
- if(!(a&(1<<i)) and b&(1<<i)) return false;
- }
- return true;
- }
- struct Dinic{
- int nodes,src,dst;
- vector<int> dist,q,work;
- struct edge{ int to, rev; ll f,cap;};
- vector< vector<edge> > g;
- Dinic(int x) : nodes(x), g(x), dist(x), q(x), work(x){}
- void add_edge(int s, int t, ll cap){
- g[s].pb((edge){t,sz(g[t]),0,cap});
- g[t].pb((edge){s,sz(g[s])-1,0,0});
- }
- bool dinic_bfs(){
- REP(i,0,sz(dist)) dist[i] = -1;
- dist[src] = 0;
- int qt = 0; q[qt++] = src;
- for(int qh = 0; qh < qt; qh++){
- int u = q[qh];
- REP(i,0,sz(g[u])){
- edge &e = g[u][i]; int v = g[u][i].to;
- if(dist[v] < 0 && e.f < e.cap) dist[v] = dist[u] + 1, q[qt++] = v;
- }
- }
- return dist[dst] >= 0;
- }
- ll dinic_dfs(int u, ll f){
- if(u == dst) return f;
- for(int &i = work[u]; i < sz(g[u]); ++i){
- edge &e = g[u][i];
- if(e.cap <= e.f) continue;
- int v = e.to;
- if(dist[v] == dist[u]+1){
- ll df = dinic_dfs(v,min(f,e.cap-e.f));
- if(df > 0){ e.f += df; g[v][e.rev].f -= df; return df; }
- }
- }
- return 0;
- }
- ll max_flow(int _src, int _dst){
- src = _src; dst = _dst;
- ll result = 0;
- while(dinic_bfs()){
- REP(i,0,sz(work)) work[i] = 0;
- while(ll delta = dinic_dfs(src,INF)) result += delta;
- }
- return result;
- }
- };
- int main(){
- fastio;
- int n,k;
- cin >> n >> k;
- Dinic dinic(n+5);
- vector<int> f(n);
- vector<int> vec(n);
- for(int i = 0; i < n; ++i){
- int x = 0,c;
- for(int j = 0; j < k; ++j){
- cin >> c;
- if(c) x |= (1 << j);
- }
- vec[i] = x;
- cin >> f[i];
- }
- int s = n+1, t = n+2;
- for(int i = 0; i < n; ++i){
- if(f[i] == 0){
- dinic.add_edge(s,i,1);
- }else{
- dinic.add_edge(i,t,1);
- }
- }
- for(int i = 0; i < n; ++i){
- for(int j = 0; j < n; ++j){
- if(f[i] == 0 and f[j] == 1 and mayor(vec[i],vec[j],k)){
- dinic.add_edge(i,j,1);
- }
- }
- }
- vector<int> ans;
- dinic.max_flow(s,t);
- for(int i = 0; i < n; ++i){
- if(dinic.dist[i] >= 0 and f[i] == 1) ans.pb(i+1);
- else if(dinic.dist[i] < 0 and f[i] == 0) ans.pb(i+1);
- }
- cout << sz(ans) << endl;
- for(int x : ans) cout << x << " "; cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement