HDU 6578

#include<bits/stdc++.h>
const int maxn = 101;
const int mod = 998244353;
typedef long long ll;
inline void reduce(int & x){ x += x >> 31 & mod; }
int f[maxn][maxn][maxn];
int g[maxn][maxn][maxn];
int t,n,m;
struct T{ int l,x; };
std::vector<T> v[maxn];
int main(){
	std::ios::sync_with_stdio(false),std::cin.tie(0);
	std::cin >> t;
	while(t --){
		std::cin >> n >> m; int o = 1;
		for(int i=1;i<=n;++i) v[i].clear();
		for(int i=1,l,r,x;i<=m;++i){
			std::cin >> l >> r >> x;
			o &= x <= r - l + 1;
			if(l != r) v[r].push_back((T){l,x});
		}
		if(!o){
			std::cout << 0 << '
';
			continue;
		}
		***f = 4;
		for(int i=2;i<=n;++i){
			for(int j=0;j<=i;++j) for(int k=j;k<=i;++k) for(int l=k;l<=n;++l) {
				reduce(g[j][k][i-1] += f[j][k][l] - mod);
				reduce(g[j][l][i-1] += f[j][k][l] - mod);
				reduce(g[k][l][i-1] += f[j][k][l] - mod);
				reduce(g[j][k][l] += f[j][k][l] - mod);
			}
			for(T t : v[i]) for(int j=0;j<=i;++j) for(int k=j;k<=i;++k) for(int l=k;l<=n;++l)
				if((t.l <= j) + (t.l <= k) + (t.l <= l) + 1 != t.x) 
					g[j][k][l] = 0;
			for(int j=0;j<=i;++j) for(int k=j;k<=i;++k) for(int l=k;l<=n;++l) 
				f[j][k][l] = g[j][k][l],g[j][k][l] = 0;
		}
		int ans = 0;
		for(int i=0;i<=n;++i) for(int j=0;j<=n;++j) for(int k=0;k<=n;++k) {
			reduce(ans += f[i][j][k] - mod);
			f[i][j][k] = g[i][j][k] = 0;
		}
		std::cout << ans << '
';
	}
}

原文地址:https://www.cnblogs.com/skip1978/p/11431397.html