QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#564570#3040. ContainerCryingWA 2ms4108kbC++144.1kb2024-09-15 10:07:582024-09-15 10:07:58

Judging History

This is the latest submission verdict.

  • [2024-09-15 10:07:58]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 4108kb
  • [2024-09-15 10:07:58]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; typedef array<int,2> pr;
const int MAXN = 510,INF = 1e9;
template<typename T>void tomin(T& x,T y){x = min(x,y);}
template<typename T>void tomax(T& x,T y){x = max(x,y);}
//
struct Edge{
    int v,f,w,rev;
    Edge(){}
    Edge(int _v,int _f,int _w,int _rev){v = _v,f = _f,w = _w,rev = _rev;}
};
namespace MCMF{
    const int MAXN = 1010;
    vector<Edge> e[MAXN];
    int n,s,t,mf;

    void reset(int _n,int _s,int _t){ n = _n,s = _s,t = _t; for(int i=1;i<=n;i++)e[i].clear(); mf = 0;}  
    int link(int u,int v,int c,int f){
        e[u].push_back(Edge(v,c,f,e[v].size()));
        e[v].push_back(Edge(u,0,-f,e[u].size()-1));
        return e[u].size() - 1;
    }  

    int dis[MAXN],pre[MAXN],inq[MAXN]; queue<int> qu;
    int spfa(){
        fill(dis+1,dis+1+n,INF); dis[s] = 0,inq[s] = 1; qu.push(s);
        while(qu.size()){
            int u = qu.front(); inq[u] = 0; qu.pop();
            for(auto E : e[u])if(E.f && dis[E.v] > dis[u] + E.w){
                dis[E.v] = dis[u] + E.w;
                pre[E.v] = E.rev;
                if(!inq[E.v])inq[E.v] = 1,qu.push(E.v);
            }
        }
        return dis[t] != INF;
    }
    void upd(){
        int f = INF;
        for(int u=t;u!=s;){
            int nxt = e[u][pre[u]].v,eid = e[u][pre[u]].rev;
            tomin(f,e[nxt][eid].f); u = nxt;
        }
        for(int u=t;u!=s;){
            int nxt = e[u][pre[u]].v,eid = e[u][pre[u]].rev;
            mf += f * e[nxt][eid].w; 
            e[nxt][eid].f -= f; e[u][pre[u]].f += f;
            u = nxt;
        }
    }
    void EK(){ while(spfa())upd(); }
}  
using MCMF::link; using MCMF::e;

int n,m,c,id[MAXN][MAXN]; string x,y;

int p[MAXN],q[MAXN],pos[MAXN],to[MAXN],s,t;

vector<pr> ans;

int chk(int f,int g){
    if(!f || !g)return 1;
    if(f>g)swap(f,g);
    return to[f] > to[g];
}

void mdf(int l,int r){
    if(l>r)swap(l,r);
    ans.push_back((pr){l,r});
}

void rev(int L,int R){
    swap(x[L],x[R]);
}

int main(){
    cin>>n>>c>>x>>y; x=" "+x,y=" "+y;

    for(int i=1;i<=n;i++)if(x[i] == '2')p[++m] = i,pos[i] = m;
    m = 0;
    for(int i=1;i<=n;i++)if(y[i] == '2')q[++m] = i;

    s = 2*m+1,t = s+1; MCMF::reset(t,s,t);
    for(int i=1;i<=m;i++)link(s,i,1,0),link(m+i,t,1,0);
    for(int i=1;i<=m;i++)for(int j=1;j<=m;j++){
        int d = abs(p[i]-q[j]),cnt = (d+1)/2;
        int w = cnt*c + (d/2) * 4 + (d&1) * 3 + max(0,j-i);
        id[i][j] = link(i,m+j,1,w);
    }
    MCMF::EK();
    for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)if(!e[i][id[i][j]].f)to[i] = j;

    while(1){ //找到一处位置试图移动
        for(int i=1;i<=m;i++){
            int d = abs(p[i] - q[to[i]]);
            if(d == 0)continue;
            if(d == 1){
                if(x[q[to[i]]] == '1'){
                    int L = p[i],R = q[to[i]];
                    if(L>R)swap(L,R);
                    ans.push_back((pr){L,R});
                    rev(L,R);
                    pos[p[i]] = 0;
                    p[i] = q[to[i]];
                    pos[p[i]] = i;
                    goto END;
                }
            }else{
                if(q[to[i]] > p[i]){
                    if(chk(i,pos[p[i]+1]) && x[p[i]+2] == '1'){
                        ans.push_back((pr){p[i],p[i]+2});
                        rev(p[i],p[i]+2);
                        pos[p[i]] = 0;
                        p[i] += 2;
                        pos[p[i]] = i;
                        goto END;
                    }
                }else{
                    if(chk(i,pos[p[i]-1]) && x[p[i]-2] == '1'){
                        ans.push_back((pr){p[i]-2,p[i]});
                        rev(p[i]-2,p[i]);
                        pos[p[i]] = 0;
                        p[i] -= 2;
                        pos[p[i]] = i;
                        goto END;
                    }
                }
            }
        }
        break;
        END:;
    }

    cout<<ans.size()<<"\n";
    for(auto [x,y] : ans)cout<<x<<" "<<y<<"\n";
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3616kb

input:

5 2
11221
21112

output:

2
1 3
4 5

result:

ok good job!

Test #2:

score: 0
Accepted
time: 0ms
memory: 3684kb

input:

7 0
2212121
1212122

output:

4
6 7
4 6
2 4
1 2

result:

ok good job!

Test #3:

score: 0
Accepted
time: 0ms
memory: 3680kb

input:

7 2
2212121
1212122

output:

3
1 3
3 5
5 7

result:

ok good job!

Test #4:

score: 0
Accepted
time: 0ms
memory: 3608kb

input:

1 0
1
1

output:

0

result:

ok good job!

Test #5:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

1 100
2
2

output:

0

result:

ok good job!

Test #6:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

2 55
12
21

output:

1
1 2

result:

ok good job!

Test #7:

score: 0
Accepted
time: 0ms
memory: 3712kb

input:

3 100
112
211

output:

1
1 3

result:

ok good job!

Test #8:

score: 0
Accepted
time: 0ms
memory: 3920kb

input:

3 99
221
212

output:

1
2 3

result:

ok good job!

Test #9:

score: 0
Accepted
time: 0ms
memory: 3668kb

input:

3 98
111
111

output:

0

result:

ok good job!

Test #10:

score: -100
Wrong Answer
time: 2ms
memory: 4108kb

input:

123 64
222111221111221122211121221221122122211222211112221221212121211221122212111212211222122212122221212121222121221112111112112
211112121222212221122212212122111121121212211211211212212211111221222212121121212222112212222211221211122212111211221122212

output:

94
3 5
2 4
7 9
5 7
4 6
9 11
8 10
7 8
12 14
15 17
16 18
17 19
21 23
24 26
22 24
26 28
24 26
27 29
30 32
28 30
26 28
31 33
29 31
34 36
32 34
30 32
37 38
42 44
41 42
44 46
52 54
50 52
48 50
54 56
61 63
59 61
57 59
56 58
55 57
53 55
52 54
50 52
65 67
64 66
63 65
61 63
59 61
69 71
71 73
73 75
79 81
78 80...

result:

wrong answer invalid plan.