QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#129324#5250. Combination LocksSommohito#WA 1ms3740kbC++204.6kb2023-07-22 15:11:422023-07-22 15:11:44

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-22 15:11:44]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3740kb
  • [2023-07-22 15:11:42]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#ifdef APURBA
#include "DEBUG_TEMPLATE.h"
#else
#define HERE
#define debug(args...)
#endif
#define ALL(x) x.begin(),x.end()
const long long flow_inf = 1e18;
struct FlowEdge {
  int v,u,id; long long cap, flow = 0;
  FlowEdge(int v, int u, long long cap,int id=-1) : v(v), u(u), cap(cap),id(id) {}
};
struct Dinic
{
  vector<FlowEdge> edges; vector<vector<int> > adj;
  int n, m = 0; int s, t;
  vector<int> level, ptr,flow_through;
  queue<int> q; vector<bool>vis;
  int maxid=0;
  Dinic() {}
  Dinic(int n) : n(n) {
    vis.resize(n); adj.resize(n);
    level.resize(n); ptr.resize(n);
  }
  void init(int n) {
    vis.resize(n); adj.resize(n);
    level.resize(n); ptr.resize(n);
  }
  void add_edge(int v, int u, long long cap,int id=-1) {
//    debug(v,u,cap);
    edges.emplace_back(v, u, cap,id);
    edges.emplace_back(u, v, 0);
    adj[v].push_back(m);
    adj[u].push_back(m + 1);
    m += 2;
    if(id!=-1)maxid++;
  }
  void dfs2(int s) {
    vis[s] = 1;
    for(int i:adj[s]) {
      int id = i; int u = edges[id].v;
      int v = edges[id].u;
      if(edges[id].flow!=edges[id].cap && !vis[v])
      {
        dfs2(v);
      }
    }
  }
  vector<int> getMinCut() {
    dfs2(s); vector<int>ret;
    for(int i=0; i<n; i++) {
      if(vis[i]) ret.push_back(i);
    }
    return ret;
  }
  bool bfs() {
    while (!q.empty()) {
      int v = q.front();
      q.pop();
      for (int id : adj[v])
      {
        if (edges[id].cap - edges[id].flow < 1)
          continue;
        if (level[edges[id].u] != -1)
          continue;
        level[edges[id].u] = level[v] + 1;
        q.push(edges[id].u);
      }
    }
    return level[t] != -1;
  }
  long long dfs(int v, long long pushed) {
    if (pushed == 0) return 0;
    if (v == t) return pushed;
    for (int& cid = ptr[v]; cid < (int)adj[v].size(); cid++){
      int id = adj[v][cid]; int u = edges[id].u;
      if (level[v] + 1 != level[u] || edges[id].cap - edges[id].flow < 1)
        continue;
      long long tr = dfs(u, min(pushed, edges[id].cap - edges[id].flow));
      if (tr == 0)
        continue;
      edges[id].flow += tr; edges[id ^ 1].flow -= tr;
      return tr;
    }
    return 0;
  }
  long long flow(int _s,int _t) {
    s=_s; t=_t;
    long long f = 0;
    while (true)
    {
      fill(level.begin(), level.end(), -1);
      level[s] = 0; q.push(s);
      if (!bfs()) break;
      fill(ptr.begin(), ptr.end(), 0);
      while (long long pushed = dfs(s, flow_inf)){
        f += pushed;
      }
    }
    flow_through.assign(maxid+1, 0);
    for(int i = 0; i < n; i++){
      for(auto j : adj[i]) {
        int idx = j;
        FlowEdge e = edges[idx];
        if(e.id >= 0)flow_through[e.id] = e.flow;
      }
    }
    return f;
  }
};

Dinic dinic1, dinic2;
int dead[1<<10+5];
int init;
int n,c;
int total;

void ADD(int u,int v)
{
    dinic1.add_edge(u,v,1);
    if(u!=init&&v!=init)
        dinic2.add_edge(u,v,1);
}

void dfs(int mask)
{
    dead[mask]=2;
    int cnt=__builtin_popcount(mask);
    if(cnt%2==__builtin_popcount(init)%2)
        ADD((1<<n),mask),total++;
    else
        ADD(mask,(1<<n)+1), total++;

    for(int i=0;i<n;i++)
    {
        int notun=mask^(1<<i);
        if(dead[notun]==1||dead[notun]==2)
            continue;
        if(cnt%2==__builtin_popcount(init)%2)
            ADD(mask,notun);
        else ADD(notun,mask);

        dfs(notun);
    }

}

void TEST_CASES()
{
    cin>>n>>c;
    string a,b;
    cin>>a>>b;
    init=0,total=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]!=b[i])
            init|=(1<<i);
    }
    memset(dead,0,sizeof dead);
    dinic1=Dinic((1<<n)+2);
    dinic2=Dinic((1<<n)+2);
    for(int i=0;i<c;i++)
    {
        string a;
        cin>>a;
        int here=0;
        for(int j=0;j<n;j++)
        {
            if(a[j]=='.')
                here|=(1<<j);
        }
        dead[here]=1;
    }
    dfs(init);
//    debug(total);
    int got1=dinic1.flow(1<<n,(1<<n)+1);
    int got2=dinic2.flow(1<<n,(1<<n)+1);
//    debug(got);
    if(got1*2==total||(got1==got2))
        cout<<"Alice\n";
    else cout<<"Bob\n";
}


/*
3
2 2
12
89
=.
==
3 1
204
101
.==
3 2
000
000
...
==.
*/

int32_t main()
{
#ifndef APURBA
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    //freopen("input.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    int t=1;
    cin>>t;
    while(t--)
    {
        TEST_CASES();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3740kb

input:

2
1 0
0
0
1 1
0
0
.

output:

Alice
Alice

result:

wrong answer 2nd lines differ - expected: 'Bob', found: 'Alice'