题目

题目链接

分析

由于每一个二进制位互不影响,因此我们可以按位做.

我们以第一位为例.
如果 x i x_i xi​第一位为1,那么 l i l_i li​到 r i r_i ri​都需要为1.
如果 x i x_i xi​第一位为0,那么 l i l_i li​到 r i r_i ri​至少有一个0.
首先我们找到必须为1的位置有哪些,如果 l l l到 r r r都为1,那么我们让 l l l到 r r r这段区间加1. 我们可以用差分,求前缀和来实现.将得到的数组设为cnt.如果cnt[i]>0则 第i位必须为1.

我们先考虑 n 2 n^2 n2的二维dp,之后会优化到 n n n
设dp[i][j]表示当前位置为i,上一个放0的位置为j 的方案数.
如果cnt[i]>0,则说明这一位必须放1,那么dp[i][j]=dp[i-1][j].
如果cnt[i]=0,那么既可以放1,也可以放0
放1: dp[i][j]=dp[i-1][j]
放0: dp[i][i]= ∑ j = 1 i − 1 d p [ i − 1 ] [ j ] \sum_{j=1}^{i-1}dp[i-1][j] ∑j=1i−1​dp[i−1][j],因为放0,之后最近的0就是i了.

现在我们还有一个条件没有满足: l l l到 r r r至少会有一个0,这就表示,r位置的前一个0必须在l之后.
我们需要把dp[r][0]到dp[r][l+1]全部清0,这些方案都不合法.

如何优化到 O ( n ) O(n) O(n) .
我们考虑滚动数组,如果放1,那么滚动数组不会发生任何变化,如果放0,我们只需要让dp[i]等于前缀和.我们用sum记录前缀和即可.
其次关于清零操作,一旦某个位置清零,那么就永远等于0了,所以我们只需要记录清零到了第last位,下次清零从last开始即可.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
const int mod =998244353;
const int maxn = 5e5+10;
const int inf = 0x3f3f3f3f;
struct node {int x,l,r;
}book[maxn];
int a[maxn],n,m,k,pre[maxn];
ll dp[maxn];
ll solve(int t) {memset(a,0,sizeof(a));memset(pre,0,sizeof(pre));memset(dp,0,sizeof(dp));t=1<<t;rep(i,1,m) {if(book[i].x&t) {a[book[i].l]++;a[book[i].r+1]--;}else {pre[book[i].r]=max(pre[book[i].r],book[i].l);}}rep(i,1,n) {a[i]=a[i-1]+a[i];}dp[0]=1;ll sum=1;int last=0;rep(i,1,n) {if(a[i]==0) {dp[i]=sum;sum=sum*2%mod;}while(last<pre[i]) {sum=(sum-dp[last]+mod)%mod;last++;}}return sum;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin>>n>>k>>m;rep(i,1,m) {cin>>book[i].l>>book[i].r>>book[i].x;}ll ans=1;rep(i,0,k-1) {ans=ans*solve(i)%mod;}cout<<ans<<'\n';return 0;
}

cf-1327F. AND Segments相关推荐

  1. Eligible Segments (CF 1588 E)

    题目链接 题目大意: 给定 n 个点,问从中能找出多少条线段,使剩余n-2个点到该线段的距离均不大于R. 前置知识: 点a到线段bc的距离,可以转换为点a到射线bc和射线cb距离的最大值. 解题思路: ...

  2. CF专题(长安大学)

    来暂时总结下这几天的CF专题吧-后续还会更新- A - Ichihime and Triangle: Ichihime is the current priestess of the Mahjong ...

  3. CF杂题训练(交互题不做,2500以上的看情况吧)

    CF专练 CF1562 A The Miracle and the Sleeper B Scenes From a Memory C Rings D Two Hundred Twenty One E ...

  4. 【打CF,学算法——三星级】CodeForces 615B Longtail Hedgehog (DFS/拓扑排序)

    [CF简介] 提交链接:CF 615B 题面: B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 ...

  5. Too Many Segments CF595D 贪心乱搞

    传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...

  6. LeetCode刷题记录10——434. Number of Segments in a String(easy)

    LeetCode刷题记录10--434. Number of Segments in a String(easy) 目录 LeetCode刷题记录9--434. Number of Segments ...

  7. codeforces 610D D. Vika and Segments(离散化+线段树+扫描线算法)

    题目链接: D. Vika and Segments time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  8. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

    前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...

  9. R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)

    R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩.自定义调色板.在两端添加点图的线段segments.整体排序从大到小.自定义数据点的大小.添加数值标签) 目录

  10. OC对象 vs CF对象

    2019独角兽企业重金招聘Python工程师标准>>> OC对象 vs CF对象 在ARC场景下,对象所有权没有转换 使用__bridge关键字即可实现CF对象和OC对象之间的自由转 ...

最新文章

  1. Windows8 下安装 Materials Studio 6.0 全过程
  2. 用RecyclerView打造一个轮播图
  3. win7无法连接打印机拒绝访问_Win7系统”windows无法连接到打印机拒绝访问“怎么办?通过创建local port端口连接来搞定...
  4. 如何在MyBatis中优雅的使用枚举
  5. 基于SSLStrip的HTTPS会话劫持
  6. python批量分析表格_Python统计分析execl文件列表值的方法
  7. 4.3 现在可用的客体类有哪些呢
  8. js能订阅mq吗_ActiveMQ+MQTT实现客户端订阅推送模式(一)订阅者
  9. iOS开发UI篇—程序启动原理和UIApplication
  10. 20200815每日一句
  11. M语言简单示例--网页数据抓取
  12. Aegisub制作字幕从入门到精通:制作srt字幕,制作ass字幕,压制字幕和视频
  13. 将图片背景设置为透明的方法介绍
  14. 二元一次方程整数解c语言,c语言求解,求解二元一次方程?
  15. 深入理解DirectX D3D9
  16. JVM中类加载的时机
  17. 设计模式系列:搞懂装饰器模式,增加自身技能
  18. python樱花_Python实现浪漫的樱花与烟花雨
  19. 【金猿产品展】齐治DSG数据库安全网关系统——统一的数据库操作管控平台
  20. js根据数组对象属性删除里面的指定对象

热门文章

  1. C语言期末考试成绩奖励编码,C语言期末考试总结,看完保你过
  2. 四百元左右有什么降噪耳机推荐?高性价比降噪耳机推荐
  3. 用FileExplorer查看android手机中的数据库
  4. QTcreater学习笔记
  5. 28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
  6. 3600万中国人在抖音“上清华”。
  7. Fotor 在线设计工具 在线设计网站
  8. RT-Thread Studio中ST-LINK下载报错“Old ST-LINK firmware version“解决
  9. GitHub 热点速览 Vol.24:程序员自我增值,优雅赚零花钱
  10. JS之删除数组中的元素