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 的题卡掉了。