场上试图拿数位瞎搞，转移转不动。。

震惊，竟然是n4的四维dp

附赠一份和题解没什么不同但是加了贼快的快读板子才能998ms过的代码_(:з」∠)_

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<utility>
#include<cstring>
#include<cstdlib>
#include<vector>
using namespace std;
typedef long long ll;
int n, m,t;
vector<pair<int, int> >rq[101];
const ll mod = 998244353;
ll d[101][101][101][2];

inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
}
inline int rd(){
char ch=nc();int sum=0;
while(!(ch>='0'&&ch<='9'))ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum;
}

int main()
{
t=rd();
while (t--) {
n=rd();m=rd();
int co = n;
for (int i = 1; i <= n; i++) {
rq[i].clear();
rq[i].push_back({ i,1 });
}
for (int i = 1; i <= m; i++) {
int l, x,r;
l=rd();r=rd();x=rd();
rq[r].push_back({ l,x });
}
memset(d, 0, sizeof(d));
d[0][0][0][0] = 1;

for(int now=1;now<=n;now++){
bool gal = now & 1;
for (int i = 0; i <= now; i++)
for (int j = i; j <= now; j++)
for (int k = j; k <= now; k++)
d[i][j][k][gal] = 0;

for(int i=0;i<=now;i++)
for (int j = i; j <= now; j++)
for (int k = j; k <= now; k++) {
d[i][j][now - 1][gal] = (d[i][j][k][gal ^ 1] + d[i][j][now - 1][gal]) % mod;
d[j][k][now - 1][gal] = (d[i][j][k][gal ^ 1] + d[j][k][now - 1][gal]) % mod;
d[i][k][now - 1][gal] = (d[i][j][k][gal ^ 1] + d[i][k][now - 1][gal]) % mod;
d[i][j][k][gal] = (d[i][j][k][gal ^ 1] + d[i][j][k][gal]) % mod;
}

for (int i = 0; i <= now; i++)
for (int j = i; j <= now; j++)
for (int k = j; k <= now; k++)
for (auto p:rq[now])
if ((p.first <= i) + (p.first <= j) + (p.first <= k) + (p.first <= now) != p.second)
d[i][j][k][gal] = 0;
}
ll ans = 0;
for (int i = 0; i <= n; i++)
for (int j = i; j <= n; j++)
for (int k = j; k <= n; k++)
ans = (ans + d[i][j][k][n & 1]) % mod;
printf("%lld\n", ans);

}

return 0;
}
Blank

本来想不用vector，拿pair写了写，还真实现不了唉。。

posted on 2019-07-28 16:48  Nonad  阅读(88)  评论(0编辑  收藏  举报