mxqz,关于unordered_map
  • 板块学术版
  • 楼主mcyqwq
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/8/26 08:38
  • 上次更新2023/11/4 08:59:47
查看原帖
mxqz,关于unordered_map
121908
mcyqwq楼主2021/8/26 08:38

下面这份代码在C++11下编译错误(问题出在unordered_map上,跟其他内容应该没有关系),应该怎么改

#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <unordered_map>

using namespace std;

#define PII pair<int, int>
#define mp(a, b) make_pair(a, b)

const int N = 1e5 + 5;
int T, n, m, q, cnt, ans[5], deg[N], head[N], c[N], sum[N][2];
struct EDGE {
	int nxt, to, w;
}e[N << 1];

vector <PII > g[N];
unordered_map<PII, int> M;

void add(int u, int v, int w) {
	e[++cnt].nxt = head[u], e[cnt].to = v, e[cnt].w = w, head[u] = cnt;
}

int main() {
	scanf("%d", &T);
	while(T--) {
		cnt = 0;
		M.clear();
		memset(ans, 0, sizeof(ans));
		memset(head, 0, sizeof(head));
		memset(sum, 0, sizeof(sum));
		memset(deg, 0, sizeof(deg));
		scanf("%d%d", &n, &m);
		for(int i = 1; i <= n; i++) scanf("%d", c + i), g[i].clear();
		for(int i = 1; i <= m; i++) {
			int u, v, w; scanf("%d%d%d", &u, &v, &w);
			if(c[u] && c[v]) ans[3] += w;
			else if(!c[u] && !c[v]) ans[1] += w;
			else ans[2] += w;
			if(M[mp(min(u, v), max(u, v))]) {
				e[M[mp(min(u, v), max(u, v))]].w += w;
				e[M[mp(min(u, v), max(u, v))] - 1].w += w;
				continue;
			}
			deg[u]++, deg[v]++;
			add(u, v, w), add(v, u, w);
			M[mp(min(u, v), max(u, v))] = cnt;
		}
		int k = sqrt(m);
		for(int i = 1; i <= n; i++) {
			for(int j = head[i]; j; j = e[j].nxt) {
				int v = e[j].to, w = e[j].w;
				if(deg[v] >= k) g[i].push_back(mp(v, w));
				if(deg[i] >= k) sum[i][c[v]] += w;
			}
		}
		scanf("%d", &q);
		while(q--) {
			int opt; scanf("%d", &opt);
			if(opt == 1) {
				int x; scanf("%d", &x);
				if(deg[x] < k) {
					for(int i = head[x]; i; i = e[i].nxt) {
						int v = e[i].to, w = e[i].w;
						if(deg[v] >= k) sum[v][c[x]] -= w, sum[v][!c[x]] += w;
						if(c[x] && c[v]) ans[3] -= w, ans[2] += w;
						else if(!c[x] && !c[v]) ans[1] -= w, ans[2] += w;
						else if(c[x]) ans[2] -= w, ans[1] += w;
						else ans[2] -= w, ans[3] += w;
					}
					c[x] = !c[x];
				}
				else {
					for(int i = 0; i < g[x].size(); i++) {
					    int v = g[x].at(i).first, w = g[x].at(i).second;
					    sum[v][c[x]] -= w, sum[v][!c[x]] += w;
				    }
				    if(c[x]) ans[3] -= sum[x][1], ans[2] += sum[x][1], ans[2] -= sum[x][0], ans[1] += sum[x][0];
				    else ans[1] -= sum[x][0], ans[2] += sum[x][0], ans[2] -= sum[x][1], ans[3] += sum[x][1];
				    c[x] = !c[x];
				}
			}
			else {
				int a, b; scanf("%d%d", &a, &b);
				if(a & b) printf("%d\n", ans[3]);
				else if(a | b) printf("%d\n", ans[2]);
				else printf("%d\n", ans[1]);
			}
		}
	}
	return 0;
}
2021/8/26 08:38
加载中...