思路:
直接枚举左端点和右端点,然后枚举另一个右端点,然后相减得到新的区间,判断是否合法
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 105;
int t;
int n, m;
int a[MAXN][MAXN], v[MAXN][MAXN];
void solve() {
for(int i = 1; i <= n; i ++)
for(int j = i; j <= n; j ++)
if(v[i][j] == t + 1) {
for(int k = i; k < j; k ++)
if(v[i][k] == t + 1) {
if(v[k + 1][j] == t + 1 && a[k + 1][j] != a[i][j] - a[i][k]) {
printf("false\n");
return ;
}
else a[k + 1][j] = a[i][j] - a[i][k], v[k + 1][j] = t + 1;
}
}
printf("true\n");
return ;
}
int main() {
scanf("%d", &t);
while(t --) {
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++) {
int x, y, w;
scanf("%d%d%d", &x, &y, &w);
a[x][y] = w;
v[x][y] = t + 1;
}
solve();
}
return 0;
}