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 << '\n';
            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 << '\n';
    }
}

Guess you like

Origin www.cnblogs.com/skip1978/p/11431397.html