关于重载运算符
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/2/7 20:48
  • 上次更新2025/2/8 09:03:26
查看原帖
关于重载运算符
608410
封禁用户楼主2025/2/7 20:48

总是写挂,但是又不知道哪里错了,求助股民

#include<bits/stdc++.h>

namespace IO {
	inline int read() {
		int ret = 0, f = 1;char ch = getchar();
		while (ch < '0' || ch > '9') {
			if (ch == '-') f = -f;
			ch = getchar();
		}
		while (ch >= '0' && ch <= '9') {
			ret = (ret << 1) + (ret << 3) + (ch ^ 48);
			ch = getchar();
		}
		return ret * f;
	}
	void write(int x) {
		if (x < 0) putchar('-'), x = -x;
		if (x > 9) write(x / 10);
		putchar(x % 10 + '0');
	}
}

using namespace IO;
using namespace std;

const int maxn = 2e5 + 5;
const int maxm = 4e5 + 5;
const int maxp = 20 + 5;

struct Node {
	int fr, to, valL, valH;
	bool operator < (const Node & x) {
		return x.valH > valH; 
	}
}Edge[maxm << 2];

int Edge_tot;

void addEdge(int u, int v, int l, int h) {
	Edge_tot++;
	Edge[Edge_tot].fr = u;
	Edge[Edge_tot].to = v;
	Edge[Edge_tot].valL = l;
	Edge[Edge_tot].valH = h;
}

int n, m, Q, K, S, ans, T;
int tot, hd[maxn << 1], to[maxm << 1], nxt[maxn << 1], val[maxm << 2], PosvalL[maxn << 1], PosvalH[maxn << 1];

void add(int u, int v, int c) {
	tot++;
	nxt[tot] = hd[u];
	hd[u] = tot;
	to[tot] = v;
	val[tot] = c;
}

int fa[maxn << 1];

struct Node1 {
	int num, value;
	bool operator < (const Node1 & x) {
		return x.value > value;
	}
};

priority_queue<Node1> q;
int dis[maxn << 1], vis[maxn << 1];
void dij() {
	q.push({1, 0});
	dis[1] = 0;
	
	while (!q.empty()) {
		Node1 now = q.top();q.pop();
		int u = now.num;
		if (vis[u]) continue;
		vis[u] = 1;
		for (int i = hd[u];i;i = nxt[i]) {
			int v = to[i], Value = val[i];
			if (dis[v] > dis[u] + Value) {
				dis[v] = dis[u] + Value;
				q.push({v, dis[u] + Value});
			}
		}
	}
}

//int dep[maxn];
int fat[maxn][maxp], Minh[maxn << 1];

void dfs(int x, int father) {
	Minh[x] = dis[x];
//	dep[x] = dep[father] + 1;
	fat[x][0] = father;
	for (int i = 1;i < maxp;i++) fat[x][i] = fat[fat[x][i - 1]][i - 1];
	
	for (int i = hd[i];i;i = nxt[i]) {
		int v = to[i];
		if (v == father) continue;
		dfs(v, x);
		Minh[x] = min(Minh[x], Minh[v]);
	} 
}

int Find(int x) {
	return (fa[x] == x) ? x : fa[x] = Find(fa[x]);
}

void init() {
	memset(Edge, 0, sizeof(Edge));
	memset(PosvalL, 0, sizeof(PosvalL));
	memset(PosvalH, 0, sizeof(PosvalH));
	memset(vis, 0, sizeof(vis));
	memset(dis, 0, sizeof(dis));	
}

int main() {
	T = read();
	
	while (T--) {
		init();
		n = read(), m = read();
		for (int i = 1;i <= m;i++) {
			int U = read(), V = read(), L = read(), A = read();
			addEdge(U, V, L, A), addEdge(V, U, L, A);
		}
		
		dij();
		
		sort(Edge + 1, Edge + 1 + m * 2);
		for (int i = 1;i <= m * 2;i++) fa[i] = i;
		int k = n;
		for (int i = 1;i <= m * 2;i++) {
			int u = Edge[i].fr, v = Edge[i].to, l = Edge[i].valL, h = Edge[i].valH;
			int ufa = Find(u), vfa = Find(v);
			if (ufa == vfa) continue;
			k++, fa[ufa] = k, fa[vfa] = k;
			add(k, ufa, l), add(k, vfa, l);
//			PosvalL[k] = l;
			PosvalH[k] = h;
		}
		
		dfs(k, 0);
		
		Q = read(), K = read(), S = read();
		
		while (Q--) {
			int v0 = read(), p0 = read();
			int v = (v0 + K * ans - 1) % (n + 1), p = (p0 + K * ans) % (S + 1);
			
			for (int i = maxp - 1;i >= 0;i--) if (fat[v][i] && PosvalH[fat[v][i]] > p) v = fat[v][i];
			
			ans = Minh[v];
			
			write(ans);puts(""); 
		}
	}
	
	return 0;
}

上面两个operator有什么问题

2025/2/7 20:48
加载中...