QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#164399 | #6116. Changing the Sequences | realIyxiang | RE | 3ms | 3888kb | C++14 | 4.0kb | 2023-09-04 22:40:40 | 2023-09-04 22:40:41 |
Judging History
answer
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <assert.h>
#include <algorithm>
#define in read()
#define fi first
#define se second
#define pb push_back
#define rep(i, x, y) for(int i = (x); i <= (y); i++)
#define per(i, x, y) for(int i = (x); i >= (y); i--)
using namespace std;
typedef long long ll;
typedef double db;
typedef vector < int > vec;
typedef pair < int , int > pii;
int read() {
int x = 0; bool f = 0; char ch = getchar(); while(!isdigit(ch)) f |= ch == '-',ch = getchar();
while(isdigit(ch)) x = x * 10 + (ch ^ 48),ch = getchar(); return f ? -x : x;
}
const int N = 5010;
const int M = 50010;
int n, m, cnt;
int a[N], b[N], pr[N], pos[N], pt[N];
int p[100][100];
int ans[N];
namespace F { // max_flow_with_cost
const int inf = 0x3f3f3f3f;
int h[N], now[N], lst[N], cnt = 1, S, T;
bool vis[N], ban[N];
ll maxflow, cost, dis[N];
struct edge { int v, w, c, nxt; } e[M << 1];
inline void tlink(int x, int y, int w, int c) { e[++cnt] = (edge) { y, w, c, h[x]}; h[x] = cnt; }
inline void link(int x, int y, int w, int c) { tlink(x, y, w, c); tlink(y, x, 0, -c); }
inline void setst(int s, int t) { S = s; T = t; }
bool bfs(int s = S) {
queue < int > q; q.push(s); rep(i, S, T) dis[i] = -1e9;
memset(vis, 0, sizeof vis); dis[s] = 0; now[s] = h[s]; vis[s] = 1;
memset(lst, -1, sizeof(lst));
/*if(s) {
rep(i, 1, 2 * m) for (int j = h[i]; j; j = e[j].nxt)
if(e[j].v > m && !e[j].w) cout << i << ' ' << e[j].v << '\n';
cout << '\n';
}*/
while(!q.empty()) {
int x = q.front(); q.pop();
for(int i = h[x], y; i; i = e[i].nxt)
if(e[i].w && dis[y = e[i].v] < dis[x] + e[i].c && !ban[y]) {
dis[y] = dis[x] + e[i].c, lst[y] = (i ^ 1); now[y] = h[y];
if(!vis[y]) vis[y] = 1, q.push(y);
}
vis[x] = 0;
}
/*if(s) {
cout << s << '\n';
rep(i, S, T) cout << i << ' ' << dis[i] << ' ' << lst[i] << '\n'; cout << '\n';
}*/
return dis[T] > -1e9;
}
int dinic(int x,int flow,ll c) {
if(x == T) return maxflow += flow, cost += c * flow, flow;
int res = flow; vis[x] = 1;
for(int i = now[x], y; i && res; i = e[i].nxt) {
now[x] = i;
if(e[i].w && dis[y = e[i].v] == dis[x] + e[i].c && !vis[y]) {
int k = dinic(y, min(res,e[i].w), c + e[i].c);
e[i].w -= k; e[i ^ 1].w += k; res -= k;
}
} vis[x] = 0;
return flow - res;
}
void runit() {
while(bfs()) dinic(S, inf, 0);
rep(i, 1, m) for (int j = h[i]; j; j = e[j].nxt)
if(!e[j].w) ans[i] = e[j].v - m;
// rep(i, 1, m) cout << ans[i] << ' '; cout << '\n';
rep(i, 1, m) assert(ans[i]);
rep(t, 1, m) {
int i = pr[t]; if(!i) break ;
rep(j, 1, ans[i] - 1) {
bfs(j + m);
// cout << i << ' ' << j << ' ' << dis[i] << ' ' << p[i][j] << '\n';
if(dis[i] + p[i][j] != 0) continue ;
// cout << i << ' ' << j << ' ' << dis[i] << ' ' << p[i][j] << '\n';
// rep(k, 1, 2 * m) cout << k << ' ' << e[lst[k]].v << '\n'; cout << '\n';
auto upd = [&](int x) {
e[x].w ^= 1, e[x ^ 1].w ^= 1;
} ;
int k = i;
for ( ; e[lst[k]].v != j + m; k = e[lst[k]].v) {
// cout << k << ' ' << e[lst[k]].v << ' ' << e[lst[e[lst[k]].v]].v << '\n';
upd(lst[k]);
k = e[lst[k]].v;
ans[e[lst[k]].v] = k - m;
upd(lst[k]);
}
upd(lst[k]);
for (k = h[i]; k; k = e[k].nxt) if(e[k].v == j + m) {
upd(k); break ;
}
ans[i] = j;
// rep(k, 1, m) cout << ans[k] << ' '; cout << '\n';
}
ban[i] = 1;
}
// rep(i, 1, m) assert(ans[i] > 0);
}
}
int main() {
n = in, m = in; rep(i, 1, n) a[i] = in; rep(i, 1, n) b[i] = in;
rep(i, 1, n) if(!pos[a[i]]) pos[a[i]] = i, pr[++cnt] = a[i];
rep(i, 1, n) p[a[i]][b[i]]++;
F :: setst(0, m * 2 + 1);
rep(i, 1, m) F :: link(0, i, 1, 0), F :: link(i + m, m * 2 + 1, 1, 0);
rep(i, 1, m) rep(j, 1, m) F :: link(i, j + m, 1, p[i][j]);
F :: runit();
rep(i, 1, n) assert(ans[a[i]]), printf("%d ", ans[a[i]]); printf("\n");
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3644kb
input:
4 3 2 2 3 3 2 2 2 2
output:
1 1 2 2
result:
ok 4 number(s): "1 1 2 2"
Test #2:
score: 0
Accepted
time: 1ms
memory: 3660kb
input:
5 3 2 2 3 3 2 2 2 2 2 3
output:
3 3 2 2 3
result:
ok 5 number(s): "3 3 2 2 3"
Test #3:
score: 0
Accepted
time: 1ms
memory: 3648kb
input:
1 1 1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 3ms
memory: 3756kb
input:
1 60 60 60
output:
60
result:
ok 1 number(s): "60"
Test #5:
score: 0
Accepted
time: 3ms
memory: 3888kb
input:
1 60 1 60
output:
60
result:
ok 1 number(s): "60"
Test #6:
score: 0
Accepted
time: 1ms
memory: 3760kb
input:
1 60 60 1
output:
1
result:
ok 1 number(s): "1"
Test #7:
score: 0
Accepted
time: 1ms
memory: 3852kb
input:
1 60 1 1
output:
1
result:
ok 1 number(s): "1"
Test #8:
score: -100
Dangerous Syscalls
input:
100000 60 18 36 47 52 31 3 43 49 2 4 60 23 22 3 4 25 11 50 25 40 51 51 59 5 11 50 47 28 29 21 46 39 46 49 23 50 1 24 15 30 45 12 5 2 4 33 23 29 35 35 47 13 10 24 20 44 23 16 27 4 25 27 47 27 57 47 35 31 24 47 27 17 45 44 29 44 43 4 23 20 22 43 2 53 41 32 56 21 28 56 21 15 44 60 11 52 36 26 33 26 4 5...