首先第一步,位运算拆位。变为一个区间的 \(And\) 为 \(0\) 或 \(1\)。

如果 \(And\) 为 \(1\),那么所有数都需要为 \(1\),否则为 \(0\)。

我们把所有可能为 \(0\) 的位置拉出来,然后和区间进行离散化。这个可以做到 \(O(n+m)\),处理每个位置前面第一个可能为 \(0\) 的位置即可。

问题转化为一个序列的一些区间中必须包含至少一个 \(0\)。仔细看看,好像和 命运 在链上的情况有点像。

于是。我们设上一个 \(dp[n][k]\) 表示当前从左往右扫描到第 \(n\) 个数,上一个 \(0\) 出现在第 \(k\) 个位置上。

分两种情况:是某个区间的右端点和不是某个区间的右端点。对于每个是右端点的位置,我们存下左端点中最靠右的那个设为 \(L_n\)。

是右端点:

\[dp[n][k]=[L_n\leq k]dp[n-1][k]
\]
\[dp[n][n]=\sum_{i=1}^{n-1}dp[n-1][i]
\]

不是右端点:

\[dp[n][k]=dp[n-1][k]
\]
\[dp[n][n]=\sum_{i=1}^{n-1}dp[n-1][i]
\]

问题相当于每次让 \(dp[n]\) 继承 \(dp[n-1]\),然后删掉某一段左端点,然后插入一个位置为左边的位置的和。

我们可以维护一个区间 \([L,R]\) 表示目前有值的区间,然后用一个 \(sum\) 维护区间的和,然后就做完了。

答案是每一位最后的 \(sum\) 的积。

#include<cstdio>
typedef unsigned ui;
const ui M=5e5+5,mod=998244353;
ui n,k,m,l[M],r[M],x[M];
ui s[M];
inline ui max(const ui&a,const ui&b){
return a>b?a:b;
}
inline ui Solve(const ui&k){
ui len(0);
static ui t[M],L[M],dp[M],pre[M];
for(ui i=1;i<=n;++i)s[i]=0;
for(ui i=1;i<=m;++i)if(t[i]=x[i]>>k&1)++s[l[i]],--s[r[i]+1];
for(ui i=1;i<=n;++i)s[i]+=s[i-1];
for(ui i=1;i<=n;++i){
if(!s[i])++len;pre[i]=len;
}
for(ui i=1;i<=len;++i)L[i]=0;
for(ui i=1;i<=m;++i)if(!t[i])L[pre[r[i]]]=max(L[pre[r[i]]],s[l[i]]?pre[l[i]]+1:pre[l[i]]);
for(ui i=1;i<=len;++i)L[i]=max(L[i],L[i-1]);
ui l(0),r(0);unsigned long long sum(1);dp[0]=1;
for(ui i=1;i<=len;++i){
while(l<L[i-1])sum-=dp[l++];dp[i]=sum%mod;sum+=dp[i];
}
while(l<L[len])sum-=dp[l++];
return sum%mod;
}
signed main(){
ui ans(1);
scanf("%u%u%u",&n,&k,&m);
for(ui i=1;i<=m;++i)scanf("%u%u%u",l+i,r+i,x+i);
for(ui i=0;i<k;++i)ans=1ull*ans*Solve(i)%mod;
printf("%u",ans);
}

CF1327F题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. js正则表达式 (.+)与(.+?)

    (.+)默认是贪婪匹配 (.+?)为惰性匹配 疑问号让.+的搜索模式从贪婪模式变成惰性模式. var str = 'aaa<div style="font-color:red;&quo ...

  2. JS 获取JSON返回的时间值转换为通常格式展示

    var date = new Date(parseInt(数据源.slice(6)));   //获取到时间  年月日时分秒 var result = date.getFullYear() + '/' ...

  3. JavaGuide--Java篇

    本文避免重复造轮子,也是从JavaGuider中提取出来方便日后查阅的手册 参考链接: JavaGuider:https://javaguide.cn/java/basis/java-basic-qu ...

  4. python篇第5天【变量】

    第4天加班 多个变量赋值 Python允许你同时为多个变量赋值.例如: a = b = c = 1 以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上. 您也可以为多个对象指定多个变 ...

  5. Vue2.0源码学习(3) - 组件的创建和patch过程

    组件化 组件化是vue的另一个核心思想,所谓的组件化就,就是说把页面拆分成多个组件(component),每个组件依赖的css.js.图片等资源放在一起开发和维护.组件是资源独立的,在内部系统中是可以 ...

  6. windows加普通用户加入管理员组

    net localgroup administrators 用户名 /add ------------>使用这句命令添加用户到管理组 shutdown -g 重启电脑

  7. [杂记]LeTeX模板——ppt

    出处:ShareLeTeX应用模板:https://cn.sharelatex.com/project/5810ad8a07a1ab0f0f8c2ce4 代码如下: 1 % Copyright 200 ...

  8. 好久没写作业了,因为组里分配了任务,学习了Resnet和DenseNet,把概要po上来和大家分享。

    Res: 学长说,不要看别人的博客.看多了就看傻了!俗话说,不听老人言,吃亏在眼前. 第一篇论文来咯!Deep Residual Learning for Image Recognition!国人写的 ...

  9. 医疗BI系统的数据分析是怎样的?

    在社会日益发展和信息化的过程中,已经发展处行业化.智能化的各类IT系统及子系统,如ERP.CRM.财务等等.实现经营流程数字化的同时,各行业企业的数据库日益庞大,医疗行业也不例外.我国医疗行业经过多年 ...

  10. linux的分区方法

    linux分区方法,不同的人有不同的方法,反正没有统一的方法.在分区方面,我觉得根据自己的实际情况来分是最好的.玩linux也有好几年了,下面说一下,我在分区方面的一些经验. 一,个人用 如果是个人用 ...