HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578)

Problem Description

There are N blanks arranged in a row. The blanks are numbered 1,2,…,N from left to right.
Tom is filling each blank with one number in {0,1,2,3}. According to his thought, the following M conditions must all be satisfied. The i-th condition is:
There are exactly xi different numbers among blanks ∈[li,ri].
In how many ways can the blanks be filled to satisfy all the conditions? Find the answer modulo 998244353.

Input

The first line of the input contains an integer T(1≤T≤15), denoting the number of test cases.
In each test case, there are two integers n(1≤n≤100) and m(0≤m≤100) in the first line, denoting the number of blanks and the number of conditions.
For the following m lines, each line contains three integers l,r and x, denoting a condition(1≤l≤r≤n, 1≤x≤4).

Output

For each testcase, output a single line containing an integer, denoting the number of ways to paint the blanks satisfying all the conditions modulo 998244353.

Sample Input

2
1 0
4 1
1 3 3

Sample Output

4
96


题意

有一个长度为n的串,这个串仅由0,1,2,3构成,给定m个条件,条件形式为在l到r区间内有x种数字(1<=x<=4)。问有多少种这样的串,答案模998244353。

思路

DP。定义一个vector记录m个条件。定义一个思维的dp数组,前三维记录每种数字最后出现的位置,最后一种数字出现的位置即为当前字符串长度。第四维为滚动数组,降低空间复杂度。dp时分四种情况进行dp,下一位数字和上一位相同,即直接将dp[i][j][k][last]继承,或者与前三维某个数字相同,将其他数字重新放入这三维进行dp即可。dp完后需判断每种情况是否满足这m个条件,即判断(i>=l)+(j>=l)+(k>=l)+(cur>=l)==x是否成立,若不成立,则将dp值直接刷新为0。最后对dp数组求和即可。

坑点

字符串长度每增加一位就需要将dp数组第四维为now的数组清空。否则就会继续继承上上次长度dp时的dp值。
最后求和得出答案时只需要对第四维为n&1的数组求和。
别忘了模998244353。


代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll MOD=998244353;
const int N=105;ll dp[N][N][N][2];void init()
{memset(dp,0,sizeof(dp));
}int main()
{int T;scanf("%d",&T);while(T--){int n,m;scanf("%d%d",&n,&m);vector<pair<int,int> > G[N];init();for(int i=0;i<m;i++){int l,r,x;scanf("%d%d%d",&l,&r,&x);G[r].push_back(make_pair(l,x));}dp[0][0][0][0]=1;for(int cur=1;cur<=n;cur++){int now=cur&1;int last=(!now);for(int i=0;i<=cur;i++){for(int j=i;j<=cur;j++){for(int k=j;k<=cur;k++){dp[i][j][k][now]=0;}}}for(int i=0;i<=cur;i++){for(int j=i;j<=cur;j++){for(int k=j;k<=cur;k++){dp[i][j][k][now]=(dp[i][j][k][now]+dp[i][j][k][last])%MOD;dp[i][j][cur-1][now]=(dp[i][j][cur-1][now]+dp[i][j][k][last])%MOD;dp[j][k][cur-1][now]=(dp[j][k][cur-1][now]+dp[i][j][k][last])%MOD;dp[i][k][cur-1][now]=(dp[i][k][cur-1][now]+dp[i][j][k][last])%MOD;}}}for(int i=0;i<=cur;i++){for(int j=i;j<=cur;j++){for(int k=j;k<=cur;k++){for(int o=0;o<(int)G[cur].size();o++){int l=G[cur][o].first;int r=cur;int x=G[cur][o].second;if((i>=l)+(j>=l)+(k>=l)+(cur>=l)!=x){dp[i][j][k][now]=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+dp[i][j][k][n&1])%MOD;}}}printf("%lld\n",ans%MOD);}return 0;
}

深夜写博客~

skr~

HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)相关推荐

  1. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场-- 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  2. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第四场)

    本来想说这场放掉了,算了还是补了吧... 以下题解包括: \[1001[HDU-6614] \\ 1003[HDU-6616] \\ 1007[HDU-6620] \\ 1008[HDU-6621] ...

  3. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第五场)

    开启疯狂水题解模式,大概会持续好几次...直到我赶上进度为止. 以下题解包括: \[1001[HDU-6624] \\ 1004[HDU-6627] \\ 1005[HDU-6628] \\ 1006 ...

  4. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第六场)

    我胡汉三又滚回来了....保质期过了的题也得记下来. 以下题解包括: \[1002[HDU-6635] \\ 1005[HDU-6638] \\ 1006[HDU-6639] \\ 1008[HDU- ...

  5. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第三场)

    以下题解包括: \[1002[HDU-6604] \\ 1004[HDU-6606] \\ 1006[HDU-6608] \\ 1007[HDU-6609] \\ 1009[HDU-6611]\] [ ...

  6. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  7. 2020杭电暑期多校02 10 - Lead of Wisdom (HDU6772) 常数坑

    20200725005909 2020杭电暑期多校02 10 - Lead of Wisdom (HDU6772) 常数坑 如果一直 TLE,就看第三章. 一.题意 物品可能的种类有 kkk 种,编号 ...

  8. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第一场)

    杭电多校第一场属实恐怖,我连补题的冲动都莫得了. 本来还想说按去年的经验来说,杭电是要比牛客稍微友好那么一丢丢的吧.结果当场打脸,签到题来了个最短路*2+网络流,这谁顶得住啊. 所以这两天都没在补这场 ...

  9. 杭电oj2033c语言,C语言训练之杭电OJ

    C语言训练之杭电OJ 一.水仙花数 Problem Description问题描述 Input输入 Output输出 Sample Input输入样例 Sample Output输出样例 代码如下: ...

最新文章

  1. python学精通要多久-精通python需要多久
  2. InnerHTML、InnerText、outerHTML、outerText的区别
  3. 安卓惯性传感器(二)
  4. python教育学_使用Python处理教育学领域的数据——以某篇期刊论文为例
  5. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(2)
  6. win7 32位机安装VMware win7 64位虚拟机
  7. 如何将Win7、Win10笔记本,台式机系统C盘软件搬家? 只需3个步骤!!!
  8. 黑色沙漠未能连接补丁服务器,打开黑色沙漠提示网络异常或者连接不上
  9. oracle更改字段大小语句,sql语句修改字段长度(实例)
  10. json文件下载--防止chrome直接打开方案
  11. 我真的不懂微信营销(一)
  12. 脑科学磁共振成像(MRI)初学者必看——功能脑网络、小世界网络、FDR校正、脑电信号频率变换、模板、假设检验、广义线性模型、独立成分分析、影像组学、任务态和静息态方法汇总
  13. Vue 事件修饰符.self的用法
  14. android 三级级联筛选列表,写给程序员的Flutter详细教程
  15. 硬件建设为学校发展服务器,《学校机房建设工程设计-建议方案》.docx
  16. Rsync命令参数以及配置使用
  17. 什么是启发式算法(heuristic algorithm)?
  18. 某基于DEDECMS5.5网站的安全检测初步报告
  19. 入门的第一个C++程序。从键盘输入学生姓名,然后输出指定格式的内容。
  20. 流程图不会画?不用担心,使用在线网站绘制流程图简单方法介绍

热门文章

  1. 导数,偏导数,方向导数与梯度的定义与联系
  2. ffmpeg插帧算法
  3. 五天学redhat系列之---文件系统管理
  4. 2013年度对话《3S 新闻周刊》
  5. 漫谈OCL概念、特征和实践(作者:大雁北飞)
  6. cond怎么读_cond condition是什么意思
  7. fiddler抓APP的htpps請求,全部都是Tunnel to ......CONNECT...443的解决办法
  8. 基于容器的后端服务架构
  9. 计算机专业2017大学排名,全国计算机专业大学排名2017计算机专业大学排名
  10. Github上利用win10使用TensorFlow(GPU)上如何去训练一个目标多分类检测的例子