求助关于输出内存
  • 板块灌水区
  • 楼主haochengw920
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/5/28 08:23
  • 上次更新2024/5/28 15:57:42
查看原帖
求助关于输出内存
563650
haochengw920楼主2024/5/28 08:23

rt,我似乎见过一种方法(但是我忘了),就是在程序前定义一个变量,程序后定义一个变量然后输出两个程序的地址差,比如:

#include<cstdio>
using namespace std;

int m1;
  
......

int m2;
  
int main()
{
  printf ("内存占用 : %lf MB\n", (&m1-&m2)/1024./1024);
  ......
}

我用这个方法输出了这个程序的内存:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

int m1;

const int MAXN = 500005, MAXK = 55;

int n, m, K, Q;
int col[MAXN];
struct egde {
	int u, v;
}e[MAXN];
struct Mdf {
	int p, c;
}a[MAXN]; int lst[MAXN];
class Dsu {
	private : 
	int fa[MAXN << 1], siz[MAXN << 1];
	int tu[MAXN << 1], tv[MAXN << 1];
	public : 
	int tp;
	inline void Init(int n) {
		for (int i = 1; i <= n; ++ i)
			fa[i] = i, siz[i] = 1;
	}
	inline int Find(int x) {
		return x == fa[x] ? x : Find(fa[x]);
	}
	inline bool Merge(int u, int v) {
		u = Find(u), v = Find(v);
		if (u == v) return false;
		if (siz[u] > siz[v]) swap(u, v);
		tu[++ tp] = u; tv[tp] = v;
		return fa[u] = v, siz[v] += siz[u], true;
	}
	inline void Del(int x) {
		while (tp > x) {
			fa[tu[tp]] = tu[tp];
			siz[tv[tp]] -= siz[tu[tp]];
			-- tp;
		}
	}
}d[MAXK];

namespace SGT {
	#define lc (u << 1)
	#define rc (u << 1 | 1)
	vector<int>tr[MAXN << 2];
	inline void Insert(int bg, int nd, int x, int u = 1, int l = 1, int r = Q) {
		if (bg <= l && r <= nd) return tr[u].emplace_back(x);
		int mid = (l + r) >> 1;
		if (bg <= mid) Insert(bg, nd, x, lc, l, mid);
		if (nd > mid) Insert(bg, nd, x, rc, mid + 1, r);
	}
	int nw[MAXK];
	inline void Solve(int u = 1, int l = 1, int r = Q) {
		for (int i = 1; i <= K; ++ i) nw[i] = d[i].tp;
		for (int x : tr[u]) {
			if (col[x]) 
				d[col[x]].Merge(e[x].u, e[x].v + n), 
				d[col[x]].Merge(e[x].u + n, e[x].v);
		}
		if (l == r) {
			int u = e[a[l].p].u, v = e[a[l].p].v;
			if (d[a[l].c].Find(u) == d[a[l].c].Find(v)) puts("NO");
			else puts("YES"), col[a[l].p] = a[l].c;
			for (int i = 1; i <= K; ++ i) d[i].Del(nw[i]);
			return;
		}
		int mid = (l + r) >> 1;
		Solve(lc, l, mid); Solve(rc, mid + 1, r);
		for (int i = 1; i <= K; ++ i) d[i].Del(nw[i]);
	}
	#undef lc
	#undef rc
}

int m2;

int main()
{
	printf ("内存占用:%lf MB\n", (&m1 - &m2) / 1024. / 1024);
	scanf ("%d%d%d%d", &n, &m, &K, &Q);
	for (int i = 1; i <= K; ++ i)
		d[i].Init(n << 1);
	for (int i = 1; i <= m; ++ i) 
		scanf ("%d%d", &e[i].u, &e[i].v);
	for (int i = 1; i <= Q; ++ i) {
		scanf ("%d%d", &a[i].p, &a[i].c);
		if (lst[a[i].p]) SGT::Insert(lst[a[i].p] + 1, i - 1, a[i].p);
		lst[a[i].p] = i;
	}
	for (int i = 1; i <= m; ++ i)
		if (lst[i]) SGT::Insert(lst[i] + 1, Q, a[lst[i]].p);
	SGT::Solve();
	return 0;
}

但是只有 200 多 MB ,却被 500 多 MB 的题卡掉了。

2024/5/28 08:23
加载中...