Address

  • 洛谷 P4229
  • UOJ #346
  • LOJ #2331

Solution

  • orz 讲课现场切掉此题的神仙 Lagoon
  • 可以发现,如果一个限制为 max ⁡ i = l r h i = x \max_{i=l}^rh_i=x maxi=lr​hi​=x ,另一个限制为 max ⁡ i = a b h i = y \max_{i=a}^bh_i=y maxi=ab​hi​=y 且 y &lt; x y&lt;x y<x
  • 那么对于任意的 k ∈ [ l , r ] ⋂ [ a , b ] k\in[l,r]\bigcap[a,b] k∈[l,r]⋂[a,b] , h k h_k hk​ 对 max ⁡ i = l r h i \max_{i=l}^rh_i maxi=lr​hi​ 没有影响
  • 所以如果每个限制的 x x x 互不相同,我们可以把区间端点离散化之后,按照 x x x 从小到大做
  • 具体地,如果一个限制为 max ⁡ i = l r h i = x \max_{i=l}^rh_i=x maxi=lr​hi​=x 且 [ l , r ] [l,r] [l,r] 内有 k k k 个位置没有 x x x 严格更小的限制覆盖
  • 那么答案乘上 x k − ( x − 1 ) k x^k-(x-1)^k xk−(x−1)k
  • 最后乘上不被任何限制区间覆盖的位置的贡献
  • O ( m 2 ) O(m^2) O(m2)
  • 而如果 x x x 有相同的,那么把 x x x 相同的放在一起做
  • 还是按 x x x 从小往大做,设满足 max ⁡ i = l r h i = x \max_{i=l}^rh_i=x maxi=lr​hi​=x 的限制有 s s s 个
  • 那么对这 s s s 个区间端点再离散化一次,为了保证接下去 DP 的复杂度
  • 注意到区间端点离散化之后,整个序列被分割为 O ( s ) O(s) O(s) 段,且每一段一定完全包含或完全不包含于任意一个满足 max ⁡ i = l r h i = x \max_{i=l}^rh_i=x maxi=lr​hi​=x 的限制区间 [ l , r ] [l,r] [l,r]
  • 设 c n t i cnt_i cnti​ 表示第 i i i 段中有多少个位置没被 x x x 严格更小的限制覆盖
  • DP 状态: f [ i ] [ j ] f[i][j] f[i][j] 表示处理到前 i i i 段,上一个恰好填 x x x 的位置在第 j j j 段,且所有右端点在前 i i i 段内的限制区间都至少包含一个恰好填 x x x 的位置的方案数(被覆盖的位置不能填数,其他位置只能填 [ 1 , x ] [1,x] [1,x] 内的数)
  • f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1
  • f [ i + 1 ] [ i + 1 ] + = f [ i ] [ j ] × ( x c n t i + 1 − ( x − 1 ) c n t i + 1 ) f[i+1][i+1]+=f[i][j]\times(x^{cnt_{i+1}}-(x-1)^{cnt_{i+1}}) f[i+1][i+1]+=f[i][j]×(xcnti+1​−(x−1)cnti+1​)
  • f [ i + 1 ] [ j ] + = f [ i ] [ j ] × ( x − 1 ) c n t i + 1 f[i+1][j]+=f[i][j]\times(x-1)^{cnt_{i+1}} f[i+1][j]+=f[i][j]×(x−1)cnti+1​
  • 注意如果以第 i + 1 i+1 i+1 段为结尾的最短区间左端点落到了第 j j j 段之后,那么第三种转移不能进行
  • O ( s 2 ) O(s^2) O(s2)
  • 最后的复杂度 O ( m 2 ) O(m^2) O(m2)

Code

#include <bits/stdc++.h>template <class T>
inline void read(T &res)
{res = 0; bool bo = 0; char c;while (((c = getchar()) < '0' || c > '9') && c != '-');if (c == '-') bo = 1; else res = c - 48;while ((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c - 48);if (bo) res = ~res + 1;
}template <class T>
inline T Max(const T &a, const T &b) {return a > b ? a : b;}const int N = 505, M = 1010, ZZQ = 998244353;int qpow(int a, int b)
{int res = 1;while (b){if (b & 1) res = 1ll * res * a % ZZQ;a = 1ll * a * a % ZZQ;b >>= 1;}return res;
}int n, q, A, tot, real[M], Tot, Real[M], f[M][M], s[M], mxr[M], ans;
bool vis[M], siv[M];struct node
{int l, r, m;
} a[N];inline bool comp(node a, node b)
{return a.m < b.m;
}void solve(int le, int ri, int num)
{Real[1] = 1; Real[Tot = 2] = tot;for (int i = le; i <= ri; i++)Real[++Tot] = a[i].l, Real[++Tot] = a[i].r + 1;std::sort(Real + 1, Real + Tot + 1);Tot = std::unique(Real + 1, Real + Tot + 1) - Real - 1;for (int i = 1; i < tot; i++) siv[i] = 0;for (int i = le; i <= ri; i++)for (int j = a[i].l; j <= a[i].r; j++)siv[j] = 1;for (int i = 1; i < tot; i++)s[i] = s[i - 1] + (vis[i] || !siv[i] ? 0 : real[i + 1] - real[i]),vis[i] = vis[i] || siv[i];f[0][0] = 1;for (int i = 1; i < Tot; i++) mxr[i] = 0;for (int i = le; i <= ri; i++){int r = std::lower_bound(Real + 1, Real + Tot + 1, a[i].r + 1) - Real - 1,l = std::lower_bound(Real + 1, Real + Tot + 1, a[i].l) - Real;mxr[r] = Max(mxr[r], l);}for (int i = 1; i < Tot; i++){int c0 = qpow(num - 1, s[Real[i + 1] - 1] - s[Real[i] - 1]),c1 = (qpow(num, s[Real[i + 1] - 1] - s[Real[i] - 1]) - c0 + ZZQ) % ZZQ;for (int j = 0; j <= i; j++) f[i][j] = 0;for (int j = 0; j < i; j++)f[i][j] = (1ll * c0 * f[i - 1][j] + f[i][j]) % ZZQ,f[i][i] = (1ll * c1 * f[i - 1][j] + f[i][i]) % ZZQ;for (int j = 0; j < mxr[i]; j++) f[i][j] = 0;}int res = 0;for (int i = mxr[Tot - 1]; i < Tot; i++)res = (res + f[Tot - 1][i]) % ZZQ;ans = 1ll * ans * res % ZZQ;
}void work()
{ans = 1;memset(vis, 0, sizeof(vis));read(n); read(q); read(A);for (int i = 1; i <= q; i++)read(a[i].l), read(a[i].r), read(a[i].m);std::sort(a + 1, a + q + 1, comp);real[1] = 1; real[tot = 2] = n + 1;for (int i = 1; i <= q; i++)real[++tot] = a[i].l, real[++tot] = a[i].r + 1;std::sort(real + 1, real + tot + 1);tot = std::unique(real + 1, real + tot + 1) - real - 1;for (int i = 1; i <= q;){int nxt = i;while (nxt <= q && a[i].m == a[nxt].m){a[nxt].l = std::lower_bound(real + 1, real + tot + 1, a[nxt].l) - real;a[nxt].r = std::lower_bound(real + 1, real + tot + 1,a[nxt].r + 1) - real - 1;nxt++;}solve(i, nxt - 1, a[i].m);i = nxt;}int res = 0;for (int i = 1; i < tot; i++) if (!vis[i]) res += real[i + 1] - real[i];printf("%d\n", 1ll * ans * qpow(A, res) % ZZQ);
}int main()
{int T; read(T);while (T--) work();return 0;
}

[UOJ#346][清华集训2017]某位歌姬的故事(DP)相关推荐

  1. 清华集训2017刷题记录

    2322. 「清华集训 2017」Hello world! 题意 一棵树每个点有点权,每次可以选择两个点\(s, t\),选择步长为\(k\),从\(s\)跳到\(t\)(不足\(k\)步直接到\(t ...

  2. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  3. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  4. 清华集训2017题解

    ioi赛制好评QAQ 好像啥都记不得了就不写游记了 Day 1 1.1 生成树计数(tree.cpp) 1.1.1. 题意 ​ 有 n≤30000n≤30000 n \le 30000 个点,第 ii ...

  5. 「清华集训 2017」某位歌姬的故事

    题目链接 问题分析 吐槽一下这个预处理比DP还长的题-- 首先对限制从小到大排序,然后不难发现对于每一种大小限制都是独立的.离散后考虑\(F[i][j]\)表示以\(i\)结尾,上一个音高为限制大小的 ...

  6. uoj#344. 【清华集训2017】我的生命已如风中残烛(计算几何)

    题面 传送门 题解 orzxyx 首先我们发现,一个点如果被到达大于一次,那么这个点肯定在一个环上.所以在不考虑环的情况下每个点只会被到达一次,那么我们就可以直接暴力了 简单来说,我们对每个点\(i\ ...

  7. [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)

    Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...

  8. JZOJ 5490. 【清华集训2017模拟11.28】图染色

    Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...

  9. BZOJ 4734 UOJ #269 [清华集训2016]如何优雅地求和 (多项式)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...

最新文章

  1. php json.parse,PHP JSON头导致JSON.parse出错(使用jQuery)
  2. 面试官:为什么 wait() 方法需要写在循环里?
  3. CRM one order性能调优指南
  4. origin遇到不适当的参数_Origin教程|如何更改Lable和设置非均匀坐标
  5. linux之LAMP架构搭建
  6. 关于thinkphp5的报错 mkdir() Permission denied的解决
  7. 大会门票限免最后一周!来聊聊 NVIDIA、抖音等大厂的 AI 技术落地
  8. vue-cli本地的一个websocket
  9. bilstmcrf词性标注_深度学习--biLSTM_CRF 命名实体识别
  10. Python标准模块--multiprocessing
  11. ERNIE 3.0 | 刷榜了!60多项任务取得最好效果
  12. winform 中导入excel时提示“未在本地计算机上注册“microsoft.ACE.oledb.12.0”
  13. java--idea--生成jar包-2
  14. icem二维非结构网格划分_“白皮书”系列No.26——科研小工具之ICEM
  15. SVN入门教程,超简单,30分钟学会!
  16. android 手表解决方案,智能手表解决方案
  17. 2022 lineCTF WEB复现WriteUp
  18. aws mediatailor运行原理图
  19. HTML中<img src=““>中图片路径的用法
  20. GPT系列-1-ChatGPT的理解

热门文章

  1. nginx配置重启后新域名及其访问不起作用
  2. Linux上的虚拟机软件有哪些
  3. i.MX6ULL终结者虚拟机VMware的安装
  4. vscode背景的更换_Vscode_更换背景
  5. python查看函数消耗的内存_如何查看内存占用和运行速度
  6. 武侠小说里的江湖和互联网公司,哪个更难混?
  7. Redis原理剖析视频
  8. Nginx超详细介绍 nginx入门 nginx配置 nginx详解 nginx优化
  9. Dapper 的输出参数使用示范
  10. Java垃圾回收算法详解