链接

Description

要求构造满足下列条件的长度为 \(n\) 的序列 \(a\) 的个数:

  • 每个数值域在 \([0, 2 ^ k)\)
  • \(m\) 个限制条件 \(l, r, x\),需要满足 \(a_l\ \text{and}\ a_{l+1} \text{and}\ ... \text{and}\ a_{r} = x\)。 (二进制按位与)

\(n, m \le 5 · 10^5\)

Solution

二进制表示,每个数都是一个 \(k\) 位的 \(01\) 串。按位与限制,不同位互不影响,考虑分别做再乘法原理乘起来。

现在问题转化为了,构造长度为 \(n\) 的 \(01\) 串,有 \(m\) 个限制。

  • 要么为一段区间都是 \(1\)。
  • 或是一段区间必须有一个 \(0\)。

不妨枚举 \(0\) 的出现位置。

状态设计

\(f_i\) 表示前 \(i\) 个位置,第 \(i\) 个位置为 \(0\)。\([1, i]\) 区间内包含的所有区间条件已经满足的方案数。

状态转移

  • 如果第 \(i\) 位必须填 \(1\)(这个用差分 \(O(n)\) 预处理),那么 \(f_i = 0\)。做完这步,第一个限制肯定满足,因为填 \(0\) 的机会全部被否认掉了。
  • 否则,枚举上一个 \(0\) 的位置 \(0 \le j < i\),即 \((j, i)\) 区间全部填 \(1\),\(f_i = \sum f_j\)。为了满足第二个条件,那么 \((j, i)\) 区间必然不能完全包含第二个限制的任何一个区间,即 \(j\) 必须 \(\ge \max(l)\),其中 \(r \le i - 1\) 的。

优化

对于 \(f_i = \sum f_j\)。发现 \(j\) 所取的是一个滑动窗口 \([\max(l), i - 1]\)。即左右端点都是不降的,这样搞一个变量动态维护这个和即可。

初始状态:\(f_0 = 1\)

答案:\(\sum f_{j}^{n}\)(最后一波连续的 \(1\) 里也不能包含第二个限制中的任意区间)

时间复杂度

\(O(kn)\)

Code

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; typedef long long LL; const int N = 500005, P = 998244353; int n, K, m, ans = 1;
int cnt[N], pre[N], f[N];
int L[N], R[N], X[N]; int inline solve(int w) {
memset(f, 0, sizeof f);
memset(cnt, 0, sizeof cnt);
memset(pre, 0, sizeof pre);
for (int i = 1; i <= m; i++) {
if (X[i] >> w & 1) cnt[L[i]]++, cnt[R[i] + 1]--;
else pre[R[i]] = max(pre[R[i]], L[i]);
}
for (int i = 1; i <= n; i++) cnt[i] += cnt[i - 1];
f[0] = 1;
int s = 1, j = 0;
for (int i = 1; i <= n; i++) {
if (!cnt[i]) f[i] = s;
(s += f[i]) %= P;
while (j < pre[i]) s = ((LL)s - f[j++] + P) % P;
}
int res = 0;
for (int i = j; i <= n; i++) (res += f[i]) %= P;
return res;
} int main() {
scanf("%d%d%d", &n, &K, &m);
for (int i = 1; i <= m; i++) scanf("%d%d%d", L + i, R + i, X + i);
for (int k = 0; k < K; k++) ans = (LL)ans * solve(k) % P;
printf("%d\n", ans);
}

CF1327F AND Segments的更多相关文章

  1. [LeetCode] Number of Segments in a String 字符串中的分段数量

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

  2. Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor

    结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...

  3. Application package 'AndroidManifest.xml' must have a minimum of 2 segments.

    看了源码就是packagename里面必须包含一个. 源码在: ./sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/id ...

  4. segments&cache

    Segments 执行效果 命令  在 sense 里边执行  GET /abcd/_segments  前边的是索引名称,后边是请求 段信息 说明  索引是面向分片的,是由于索引是由一个或多个分片( ...

  5. [UCSD白板题] Points and Segments

    Problem Introduction The goal in this problem is given a set of segments on a line and a set of poin ...

  6. [UCSD白板题] Covering Segments by Points

    Problem Introduction You are given a set of segments on a line and your goal is to mark as few point ...

  7. MAPPING SEGMENTS TO PAGES

    The segmentation and paging mechanisms provide in the support a wide variety of approaches to memory ...

  8. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并

    D. Vika and Segments     Vika has an infinite sheet of squared paper. Initially all squares are whit ...

  9. Leetcode: Number of Segments in a String

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

随机推荐

  1. python3中我所了解的print()的用法

    1.最基础的用法:打印调试信息等字符串语句.而且在3里面,打印中文的时候不需要加u了. 2.打印变量 打印默认换行的: 打印出来不想要他换行的:参数end='',这样打印出来就可以不换行了,这种骚操作 ...

  2. 深入理解r2dbc-mysql

    目录 简介 r2dbc-mysql的maven依赖 创建connectionFactory 使用MySqlConnectionFactory创建connection 执行statement 执行事务 ...

  3. Oracle表和表空间查询

    用户查询 查询和用户相关的数据 创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPOR ...

  4. Java web项目 上传图片保存到数据库,并且查看图片,(从eclipse上移动到tomact服务器上,之路径更改,包括显示图片和导出excel)

    //项目做完之后,在本机电脑运行完全正常,上传图片,显示图片,导出excel,读取excel等功能,没有任何问题,但是,当打成war包放到服务器上时,这些功能全部不能正常使用. 最大的原因就是,本机测 ...

  5. JavaScript正则学习笔记

    RegExp 元字符 ' . ' 点号:匹配任意的字符 ^ $ 位置字符 ^ 匹配字符串开始的位置 $ 匹配字符串结束的位置 匹配数字和非数字 \d 和 \D 匹配空白字符 \s 和 \S \s 匹配 ...

  6. CTF练习(1)这是一张单纯的图片?

    1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个  CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便   ...

  7. H5系列之svg

    svg呢,跟canvas其实都是用来画图的,只不过svg画的图,是矢量图,矢量图有个特点是,放大缩小,不会失真,canvas呢,是逐像素进行渲染的. 也就是,他依赖分辨率,会根据分辨率来决定图形是否清 ...

  8. P3694 邦邦的大合唱站队 题解

    \( 数据范围暗示状压,爪巴. \\ 首先考虑状态量. \\ 我们设计一个关于乐队数量的状态 S, 代表排列好的乐队.\\ \) eg: if(Set_排列好的队列 = {1, 2, 5}) then ...

  9. 终于有人把鸿蒙OS讲明白了,大佬讲解!快收藏!

    来自 | GitHub科技 本文面向的是开发人员,主要想通过科普让大家了解一下鸿蒙开发.接下来,我想给大家科普一下这个这么火的鸿蒙系统. 到底什么是鸿蒙 OS 在官网上看到鸿蒙 OS 的简介是,分布式 ...

  10. netty&websocket

    1.先判断是不是http 消息,不是返回400,是则remove之前添加的http组件,动态添加websocket组件 添加WebSocket Encoder和WebSocket Decoder之后, ...