QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#163811#6116. Changing the SequencesrealIyxiang#WA 3ms3828kbC++142.8kb2023-09-04 15:26:532023-09-04 15:26:53

Judging History

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

  • [2023-09-04 15:26:53]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:3828kb
  • [2023-09-04 15:26:53]
  • 提交

answer

#include <bits/stdc++.h>

#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;

namespace F { // max_flow_with_cost
    const int inf = 0x3f3f3f3f;
    int h[N], now[N], cnt = 1, S, T;
    bool vis[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() {
		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;
		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) {
					dis[y] = dis[x] + e[i].c; now[y] = h[y];
					if(!vis[y]) vis[y] = 1, q.push(y);
				}
			vis[x] = 0;
		} return dis[T] >= 0;
    }
    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); }
	int get(int x) { for(int i = h[x], y = e[i].v; i; i = e[i].nxt, y = e[i].v) if(!e[i].w) return y; }
}

int n, m;
int a[N], b[N], pt[N], pos[N], ind[N];
int p[100][100];
int ans[N];

int main() {
#ifdef YJR_2333_TEST
    freopen("1.in","r",stdin);
#endif
	n = in, m = in; rep(i, 1, n) a[i] = in; rep(i, 1, n) b[i] = in;
	rep(i, 1, m) pt[i] = i; rep(i, 1, n) if(!pos[a[i]]) pos[a[i]] = i;
	sort(pt + 1, pt + m + 1, [&](int x, int y) { return pos[x] > pos[y]; });
	rep(i, 1, m) ind[pt[i]] = i;
	rep(i, 1, n) p[a[i]][b[i]]++;
	F :: setst(0, m * 2 + 1);
	per(i, m, 1) F :: link(0, i, 1, 0);
	rep(i, 1, m) F :: link(i + m, m * 2 + 1, 1, 0);
	rep(i, 1, m) per(j, m, 1) F :: link(i, j + m, 1, p[pt[i]][j]);
	F :: runit(); cerr << F :: maxflow << endl;
	rep(i, 1, m) ans[i] = F :: get(ind[i]) - m;
	rep(i, 1, n) printf("%d ", ans[a[i]]); printf("\n");
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3648kb

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: 3652kb

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: 3624kb

input:

1 1
1
1

output:

1 

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 1ms
memory: 3784kb

input:

1 60
60
60

output:

60 

result:

ok 1 number(s): "60"

Test #5:

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

input:

1 60
1
60

output:

60 

result:

ok 1 number(s): "60"

Test #6:

score: 0
Accepted
time: 1ms
memory: 3784kb

input:

1 60
60
1

output:

1 

result:

ok 1 number(s): "1"

Test #7:

score: 0
Accepted
time: 1ms
memory: 3828kb

input:

1 60
1
1

output:

1 

result:

ok 1 number(s): "1"

Test #8:

score: -100
Wrong Answer
time: 3ms
memory: 3700kb

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...

output:

0 0 0 0 0 4 0 0 3 2 0 0 0 4 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 

result:

wrong answer 1st numbers differ - expected: '41', found: '0'