萌新刚学 OI,再次求助挂掉的网络流
查看原帖
萌新刚学 OI,再次求助挂掉的网络流
298549
SIXIANG32楼主2021/6/7 22:09
#include <iostream> 
#include <cstring>
#include <queue>
#define MAXN 300000
#define INF 0x7f7f7f7f
#define QWQ cout << "QWQ" << endl;
using namespace std;
int tot = 1, n, m, s, t;
int max(int x, int y) {return ((x > y) ? (x) : (y));}
int min(int x, int y) {return ((x < y) ? (x) : (y));}
struct node {
	int to, val, next;
} gra[MAXN * 2 + 10];
int head[MAXN + 10], fa[MAXN + 10];
void link(int x, int y, int z) {
	gra[++tot].to = y, gra[tot].val = z, gra[tot].next = head[x], head[x] = tot;
	gra[++tot].to = x, gra[tot].val = 0, gra[tot].next = head[y], head[y] = tot;
}
int dis[MAXN + 10], f[MAXN + 10], Now[MAXN + 10], a[MAXN + 10];
bool vis[MAXN + 10];
bool qwq[MAXN + 10];
bool bfs() {
	memset(dis, 0, sizeof(dis));
	queue <int> que;
	que.push(s), dis[s] = 1, Now[s] = head[s];
	while(!que.empty()) {
		int fr = que.front(); que.pop();
		for(int p = head[fr]; p; p = gra[p].next) {
			int v = gra[p].to, w = gra[p].val;
			if(w && !dis[v]) {
				que.push(v);
				Now[v] = head[v];
				dis[v] = dis[fr] + 1;
				if(v == t) return 1;
			}
		}
	}
	return 0;
}
int Dinic(int u, int over) {
	if(u == t) return over;
	int res = over;
	for(int p = Now[u]; p && res; p = gra[p].next) {
		int v = gra[p].to, w = gra[p].val;
		Now[u] = p;
		if(w && dis[v] == dis[u] + 1) {
			int k = Dinic(v, min(res, w));
			if(!k) dis[v] = 0x7f7f7f7f;
			if(u != s) vis[v - n] = 1;
			gra[p].val -= k;
			gra[p ^ 1].val += k;
			res -= k;
		}
	}
	return over - res;
}
int Max_Flow() {
	int rest = 0;
	while(bfs()) {
		rest += Dinic(s, INF);
	}
	return rest;
}
int solve_1(int len) {
	for(int p = 1; p <= len; p++) f[p] = 1;
	for(int p = 1; p <= len; p++)
		for(int i = 1; i < p; i++)
			if(a[p] >= a[i])
				f[p] = max(f[p], f[i] + 1);
	int maxn = 0;
	for(int p = 1; p <= len; p++)
		maxn = max(maxn, f[p]);
	return maxn;
}
void solve_2(int len, int ml) {
	for(int p = 1; p <= len; p++) {
		if(f[p] == 1) link(s, p, 1);
		if(f[p] == ml) link(p + len, t, 1);
		link(p, p + len, 1);
	}
	for(int p = 1; p <= len; p++)
		for(int i = 1; i < p; i++)
			if(f[i] + 1 == f[p] && a[p] >= a[i])
				link(i + len, p, 1);
	int qwq = Max_Flow();
	cout << qwq << endl;
}
void solve_3(int len, int ml) {
	link(1, 1 + len, INF), link(s, 1, INF);
    if(f[len] == ml) link(len, len + len, INF), link(len + len, t, INF);
	cout << Max_Flow() << endl;
}
int main() {
	int n;
	cin >> n, s = n * 2 + 1, t = n * 2 + 2;
	for(int p = 1; p <= n; p++)
		cin >> a[p];
	int ml = solve_1(n);
	cout << ml << endl;
	solve_2(n, ml);
	solve_3(n, ml); 
}

我也不知道第三问怎么会挂啊/kk
检查了很多次,没毛病啊/kk 求助/kel

2021/6/7 22:09
加载中...