首先第一步,位运算拆位。变为一个区间的 \(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. 认识Html DOM

    1.认识HTML DOM HTML Document Object Model 即:超文本标记语言-文档对象模型 HTML DOM理解为网页的API.它将网页中的各个元素都看作一个个对象,从而使网页中 ...

  2. 抽象类,interface接口,接口和继承的区别

    一.抽象类 需要抽象类的原因:父类方法不确定性的问题.考虑将该方法设计为抽象(abstract)方法所谓抽象方法就是没有实现的方法.所谓没有实现就是指,没有方法体.当一个类中存在抽象方法时,需要将该类 ...

  3. 5、前端--js常量、变量、5种基本数据类型(number string boolean undefined object)、运算符、流程控制、三元运算符、函数、自定义对象、内置对象、BOM操作

    变量与常量 在JS中声明变量需要使用关键字 老版本 var(全部都是全局变量) 新版本 let(可以声明局部变量) # 推荐使用let(其实问题不大) 在JS中声明常量也需要使用关键字 const # ...

  4. Solution -「LOCAL」「cov. 牛客多校 2020 第三场 I」礼物

    \(\mathcal{Description}\)   给定排列 \(\{a_n\}\),求字典序第 \(K\) 大的合法排列 \(\{b_n\}\).称一个排列 \(\{p_n\}\) 合法,当且仅 ...

  5. Solution -「CF 1392G」Omkar and Pies

    \(\mathcal{Description}\)   Link.   给定两个长度为 \(K\) 的 \(01\) 串 \(S,T\) 和 \(n\) 组操作 \((a_i,b_i)\),意义为交换 ...

  6. suse 12 二进制部署 Kubernetets 1.19.7 - 第00章 - 环境准备

    文章目录 0.环境准备 0.0.修改主机名 0.1.添加hosts解析 0.2.配置ssh免密 0.3.发送hosts解析文件到其他节点,并修改hostname 0.4.更新PATH变量 0.5.安装 ...

  7. Spring Boot run()方法剖析

    Spring Boot自动配置部分重点介绍了相关注解,关于main中调用的run方法并没有阐述过.run方法的作用是什么呢?只有注解没有main里的run方法Spring Boot工程就好比身体个方面 ...

  8. python-利用random模块生成测试数据封装方法总结

    1.前言: 在测试中经常有需要用到参数化,我们可以用random模块,faker模块生成测试数据,也可以用到pymysql,此文主要针对random模块生成任意个数的随机整数,随机字符串,随机手机号, ...

  9. Typora的使用教程.md

    Typora的使用教程 原创:https://home.cnblogs.com/u/cn-zhouchao 2021.12.13 一.软件的介绍 Typora 是一款由 Abner Lee 开发的轻量 ...

  10. 如何使用 Rancher Desktop 访问 Traefik Proxy 仪表板

    Adrian Goins 最近举办了关于如何使用 K3s 和 Traefik 保护和控制边缘的 Kubernetes 大师班,演示了如何访问 K3s 的 Traefik Proxy 仪表板,可以通过以 ...