cf-1327F. AND Segments
题目
题目链接
分析
由于每一个二进制位互不影响,因此我们可以按位做.
我们以第一位为例.
如果 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−1dp[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相关推荐
- Eligible Segments (CF 1588 E)
题目链接 题目大意: 给定 n 个点,问从中能找出多少条线段,使剩余n-2个点到该线段的距离均不大于R. 前置知识: 点a到线段bc的距离,可以转换为点a到射线bc和射线cb距离的最大值. 解题思路: ...
- CF专题(长安大学)
来暂时总结下这几天的CF专题吧-后续还会更新- A - Ichihime and Triangle: Ichihime is the current priestess of the Mahjong ...
- CF杂题训练(交互题不做,2500以上的看情况吧)
CF专练 CF1562 A The Miracle and the Sleeper B Scenes From a Memory C Rings D Two Hundred Twenty One E ...
- 【打CF,学算法——三星级】CodeForces 615B Longtail Hedgehog (DFS/拓扑排序)
[CF简介] 提交链接:CF 615B 题面: B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 ...
- Too Many Segments CF595D 贪心乱搞
传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...
- 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 ...
- codeforces 610D D. Vika and Segments(离散化+线段树+扫描线算法)
题目链接: D. Vika and Segments time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!
前言: 在前三篇的文章中,和大家一起创建了一个用于TCP连接检测的小组件,如果你记不得了,可以通过以下链接去回顾一下: 『参考』.net CF组件编程(1)--基础之后 『参考』.net CF组件编程 ...
- R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)
R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩.自定义调色板.在两端添加点图的线段segments.整体排序从大到小.自定义数据点的大小.添加数值标签) 目录
- OC对象 vs CF对象
2019独角兽企业重金招聘Python工程师标准>>> OC对象 vs CF对象 在ARC场景下,对象所有权没有转换 使用__bridge关键字即可实现CF对象和OC对象之间的自由转 ...
最新文章
- Windows8 下安装 Materials Studio 6.0 全过程
- 用RecyclerView打造一个轮播图
- win7无法连接打印机拒绝访问_Win7系统”windows无法连接到打印机拒绝访问“怎么办?通过创建local port端口连接来搞定...
- 如何在MyBatis中优雅的使用枚举
- 基于SSLStrip的HTTPS会话劫持
- python批量分析表格_Python统计分析execl文件列表值的方法
- 4.3 现在可用的客体类有哪些呢
- js能订阅mq吗_ActiveMQ+MQTT实现客户端订阅推送模式(一)订阅者
- iOS开发UI篇—程序启动原理和UIApplication
- 20200815每日一句
- M语言简单示例--网页数据抓取
- Aegisub制作字幕从入门到精通:制作srt字幕,制作ass字幕,压制字幕和视频
- 将图片背景设置为透明的方法介绍
- 二元一次方程整数解c语言,c语言求解,求解二元一次方程?
- 深入理解DirectX D3D9
- JVM中类加载的时机
- 设计模式系列:搞懂装饰器模式,增加自身技能
- python樱花_Python实现浪漫的樱花与烟花雨
- 【金猿产品展】齐治DSG数据库安全网关系统——统一的数据库操作管控平台
- js根据数组对象属性删除里面的指定对象
热门文章
- C语言期末考试成绩奖励编码,C语言期末考试总结,看完保你过
- 四百元左右有什么降噪耳机推荐?高性价比降噪耳机推荐
- 用FileExplorer查看android手机中的数据库
- QTcreater学习笔记
- 28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
- 3600万中国人在抖音“上清华”。
- Fotor 在线设计工具 在线设计网站
- RT-Thread Studio中ST-LINK下载报错“Old ST-LINK firmware version“解决
- GitHub 热点速览 Vol.24:程序员自我增值,优雅赚零花钱
- JS之删除数组中的元素