RT,这样都能 A:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100100
#define in read()
inline int read(){
int x = 0; char c = getchar();
while(c < '0' or c > '9') c = getchar();
while('0' <= c and c <= '9'){
x = x * 10 + c - '0'; c = getchar();
}
return x;
}
int n = 0; int m = 0;
int k = 0; int q = 0;
inline int cal(int x) { return (x % k + k) % k; }
int fa[MAXN];
int siz[MAXN];
int dis[MAXN];
void init() { for(int i = 1; i < MAXN; i++) siz[i] = 1; }
int find(int x, int &d){
d = 0;
while(fa[x]) d += dis[x], x = fa[x];
return x;
}
int getdis(int x,int y){
int disx = 0, disy = 0;
x = find(x, disx); y = find(y, disy);
if(x != y) return -1;
return cal(disx - disy);
}
void merge(int x, int y, int z){
int disx = 0, disy = 0;
x = find(x, disx); y = find(y,disy);
if(siz[x] > siz[y]) swap(x, y), swap(disx, disy), z = -z;
dis[x] = z + disy - disx, fa[x] = y, siz[y] += siz[x];
}
void del(int x, int y){
if(fa[y] == x) swap(x, y);
if(fa[x] != y) return;
int d, f = find(x, d);
for(int xx = fa[x]; xx; xx = fa[xx]) siz[xx] -= siz[x];
fa[x] = 0, dis[x] = 0;
}
int main(){
init();
n = in, m = in, k = in, q = in;
for(int i = 1; i <= m; i++){
int a = in, b = in, c = in;
merge(a, b, c);
}
while(q--){
int op = in;
if(op == 1){
int a = in, b = in, c = in;
merge(a, b, c);
}
else if(op == 2){
int a = in, b = in;
del(a, b);
}
else{
int a = in, b = in, c = in;
int d = getdis(b, a);
if(d == -1) puts("-1");
else cout << cal(c + d) << '\n';
}
}
return 0;
}
这个代码的 hack 在这里:
input:
4 2 9 3
1 2 1
2 3 2
1 2 3 1
2 3 4
3 3 4 2
output:
-1
这段程序运行出来要么卡死要么输出 1。