QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#564570 | #3040. Container | Crying | WA | 2ms | 4108kb | C++14 | 4.1kb | 2024-09-15 10:07:58 | 2024-09-15 10:07:58 |
Judging History
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.