P14510 夜里亦始终想念着你 miss 题解

news/2025/11/18 18:41:18/文章来源:https://www.cnblogs.com/zifanoi/p/19238902

验题人题解。

观察所有 \(\tt 0\) 的位置,容易发现 \(\forall i\),从左到右第 \(i\)\(\tt 0\) 所在位置的奇偶性是固定的。且任意一个这样的棋盘都能通过题面中的操作得到。

考察操作的可逆性,容易想到令每个 \(S\) 对应一个具有代表性的棋盘状态。

考虑构造这样的一个棋盘状态。在满足位置奇偶性正确的情况下,先令所有 \(\tt 0\) 尽量靠左。接下来从左到右考虑每个 \(\tt 0\) 的位置,若一个 \(\tt 0\) 所在的位置 \(i\in S\),则令这个 \(\tt 0\) 及其后面所有 \(\tt 0\) 都向右移动两格。若没有 \(\tt 0\) 被移出格子,则 \(S\) 合法。

容易使用线段树维护尽量靠左的情况下,最后一个 \(\tt 0\) 的位置,记为 \(p\)。记 \(\tt 0\) 的个数为 \(c\)。枚举最后一个 \(\tt 0\) 向右移动的次数 \(i\),容易得到答案:

\[\sum_{i=0}^{\lfloor\frac{n-p}2\rfloor}2^{n-c-i}{c+i-1\choose c-1} \]

\(m=\lfloor\frac{n-p}2\rfloor\),则答案为:

\[\begin{aligned}&\sum_{i=0}^{m}2^{n-c-i}{c+i-1\choose c-1}\\ =&2^{n-c-m-1}\sum_{i=0}^{m}2^{m-i+1}{c-1+i\choose c-1}\\ =&2^{n-c-m-1}\sum_{i=c}^{m+c}{m+c\choose i}\\ =&2^{n-c-m}\left(2^{m+c}-\sum_{i=0}^{c-1}{m+c\choose i}\right)\\ =&2^{n}-2^{n-c-m}\sum_{i=0}^{c-1}{m+c\choose i}\\\end{aligned} \]

问题转化为组合数下标前缀和,容易想到莫队。由于操作是单点修改,\(c\)\(m\) 的变化量都是 \(\mathcal O(1)\) 级别的,不用莫队,暴力求变化量即可。时间复杂度 \(\mathcal O(q\log n)\)

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 500003
#define md 1000000007
#define pb push_back
#define mkp make_pair
#define ld long double
#define umap unordered_map
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
#define pq priority_queue
using namespace std;
ll power(ll x,int y){ll ans=1;for(;y;y>>=1){if(y&1)ans=ans*x%md;x=x*x%md;}return ans;
}
struct node{int l,r,x;
}t[mxn<<2];
struct asker{int a,b,i;
}d[mxn];
int n,q,c,tt,now;
char s[mxn];
ll f[mxn<<1],f1[mxn<<1],fac[mxn<<1],ifac[mxn<<1],ans[mxn],s1[mxn],s2[mxn];
node operator+(node x,node y){return {min(x.l,y.l),max(x.r,y.r),x.x+y.x+(x.r&&y.l<=n?((x.r^y.l)&1?1:2):0)};
}
void build(int p,int l,int r){if(l==r){if(s[l]=='0')t[p]={l,l,0};else t[p]={n+1,0,0};return;}int mid=(l+r)>>1;build(p<<1,l,mid);build(p<<1|1,mid+1,r);t[p]=t[p<<1]+t[p<<1|1];
}
void upd(int p,int x,int l,int r){if(l==r){if(s[l]=='0')t[p]={l,l,0};else t[p]={n+1,0,0};return;}int mid=(l+r)>>1;if(x<=mid)upd(p<<1,x,l,mid);else upd(p<<1|1,x,mid+1,r);t[p]=t[p<<1]+t[p<<1|1];
}
void init(int n){f[0]=f1[0]=1;rep(i,1,n)f[i]=f[i-1]*2%md,f1[i]=f1[i-1]*500000004%md;fac[0]=1;rep(i,1,n)fac[i]=fac[i-1]*i%md;ifac[n]=power(fac[n],md-2);drep(i,n,1)ifac[i-1]=ifac[i]*i%md;
}
inline ll C(int n,int m){if(n<m||m<0)return 0;return fac[n]*ifac[m]%md*ifac[n-m]%md;
}
void get(int m,int c){s2[now]=f[n]%md;d[++tt]={m+c+1,c,now};s1[now]=(md-f1[m+c])*f[n-1]%md;
}
void solve(){if(!c){ans[now]=f[n];return;}int p=(t[1].l&1?1:2)+t[1].x;get((n-p)>>1,c-1);
}
signed main(){scanf("%d%d%s",&n,&q,s+1);rep(i,1,n)if(s[i]=='0')c++;init(n<<1);build(1,1,n);rep(i,0,q)s1[i]=1,s2[i]=0;now=0;solve();int x;rep(i,1,q){scanf("%d",&x);if(s[x]=='1')c++;else c--;s[x]^=1;upd(1,x,1,n);now=i;solve();}int l=0,r=0;ll vl=1;rep(i,1,tt){while(l<d[i].a)vl=(vl*2-C(l,r))%md,l++;while(r>d[i].b)vl=(vl-C(l,r))%md,r--;while(l>d[i].a)vl=(vl+C(l-1,r))*500000004%md,l--;while(r<d[i].b)vl=(vl+C(l,r+1))%md,r++;ans[d[i].i]=vl;}rep(i,0,q){cout<<((ans[i]*s1[i]+s2[i])%md+md)%md<<'\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/969236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月高温轴承工厂排行榜,高温轴承公司推荐,耐高温轴承供应厂家,耐高温轴承源头厂家-骄铭轴承

2025年11月高温轴承工厂排行榜,高温轴承公司推荐,耐高温轴承供应厂家,耐高温轴承源头厂家-骄铭轴承2025年11月高温轴承工厂排行榜,高温轴承公司推荐,耐高温轴承供应厂家,耐高温轴承源头厂家-骄铭轴承在工业生产的…

B4185 [中山市赛 2024/科大国创杯小学组 2023] 倍数子串/子串 题解

奥数题。 一个数字是五的倍数的话,这个数末尾一定是零或五,如果是四的倍数的话,末尾两位一定是四的倍数,我们可以枚举每一个数作为末尾,如果该数的这一位和上一位组成的十位数为四的倍数,那么以这两个数为末尾的…

20251117 - Manacher

前言 怎么又有 ABB 啊,连考三次,罚时吃饱了!Manacher,俗称马拉车,是一个可以线性的求出一个串的最长回文子串。 如何求解最长回文子串呢? 马拉车方法零: 首先枚举字符串的左端点和右端点,在判断区间是否是回文…

Prufer序列和Cayley定理

OI Wiki讲的还挺好的。 标号无根树 其实就是把一棵无根树标一下号,让每一个节点是唯一的。 双射 通俗来讲就是一个 \(A\) 可以对应到一个唯一确定的 \(B\),反之也是如此。 Prufer序列 构造 Prufer 序列的构建方法如下…

完整教程:PB级数据洪流下的抉择:从大数据架构师视角,深度解析时序数据库选型与性能优化(聚焦Apache IoTDB)

完整教程:PB级数据洪流下的抉择:从大数据架构师视角,深度解析时序数据库选型与性能优化(聚焦Apache IoTDB)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

软件工程学习日志2025.11.18

嗨,各位小伙伴,今天开始我想开一个新坑,用几天时间,聊聊如何为一个非常特殊的行业——医疗器械——设计一套进销存管理系统。这可不是普通的商品管理,它关乎人的健康与安全,所以咱们设计的系统,也得有点“医者仁…

11.14 事务的四大特性 并发事务问题

原子性 一致性 隔离性 持久性 脏读:一个事务读到另一个事务的未提交数据 不可重复读:一个事务读取同一条记录,数据不同 幻读:一个事务在读是未发现的数据却在插入时出现

SQL逻辑查询语句执行顺序

details summary::before { content: "▶"; position: absolute; left: 8px; transition: all 0.3s ease } details[open] summary::before { transform: rotate(90deg) } summary { list-style: none; curs…

解码死锁的产生与解决

死锁 死锁是多线程 / 多进程并发编程中常见的严重问题,指两个或多个线程 / 进程因互相争抢资源而陷入无限等待状态,若无外力干预将永久无法继续执行。其本质是资源分配与调度不当导致的 “资源僵局”,典型现实类比是…

uniapp的rich-text在渲染长数字与长字母时不换行

在rich-text的容器上新增 容器 容器 容器 不是rich-text组件本身word-break: break-all; word-wrap: break-word; 出现此问题是因为浏览器将其视为了一个单词所以未进行换行

头部厂商易路AI HR实战解析:从人海战术到智能闭环的合规跃迁

在连锁零售与餐饮行业,食品安全是企业的生命线,而员工健康证管理则是保障这条生命线的第一道防线。对于拥有数千家门店、数万名员工的行业巨头而言,健康证管理绝非一项简单的事务性工作,它关乎企业合规的基石、品牌…

【微信小程序 + 登录流程】微信小程序授权登录完整流程,一篇搞定!(含代码实现) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

linux auto

您提到的“Linux auto”可能是指“Linux 自动化”或“Linux 自动化工具”,我将为您介绍一些常见的 Linux 自动化工具和命令,帮助您实现自动化任务。一、Linux 自动化工具 1. Ansible功能:基于 YAML 的自动化工具,支…

记录相关的操作

details summary::before { content: "▶"; position: absolute; left: 8px; transition: all 0.3s ease } details[open] summary::before { transform: rotate(90deg) } summary { list-style: none; curs…

P9846 [ICPC 2021 Nanjing R] Paimons Tree

派蒙题。 首先发现填完权值后的直接必定是原树直径中的某一条,但是无法确定是其中哪一条,所以这个发现是没用的/tx。 发现按照题目的染色方法,每个时刻染色的边必然为一条路径。 观察到 \(n\) 的范围很小,首先考虑…

linux audio

在 Linux 系统中,音频相关操作可以通过多种方式实现,包括使用内核音频驱动、 ALSA(Advanced Linux Sound Architecture)或 JACK 音频服务器等。以下是一些常见的 Linux 音频操作命令和脚本示例,适用于大多数 Linu…

不同方向的箭头符号

1. 基础方向箭头 ▶ 右箭头 (U+25B6) ◀ 左箭头 (U+25C0) ▼ 下箭头 (U+25BC) ▲ 上箭头 (U+25B2)2. 实心箭头 🔺 实心上三角 (U+1F53A) 🔻 实心下三角 (U+1F53B) ⏩ 快进右箭头 (U+23E9) ⏪ 快退左箭头 (U+23EA)3…

11.13 表子查询 内连接补充 事务

SELECT xx.*FROM(SELECT。。。。。; 内连接出来的是笛卡尔积,必须用条件消除 事务就是捆绑的操作集合 事务操作 SELECT @@autocommit ==1,自动提交 SET @@zutocommit=0; 手动提交: commint; 执行失败要回滚事务 ro…

Elasticsearch 7.17 集群添加账号密码

Elasticsearch 7.17 集群添加账号密码1. 环境信息 1.1 主机列表IP 主机名 操作系统 JAVA_HOME10.0.0.22 SY-AFP-ES01 Red Hat Enterprise Linux release 8.6 (Ootpa) /opt/app/middles/jdk1.8.0_47110.0.0.23 SY-AFP-E…

实用指南:【XR硬件系列】影目GO3智能眼镜发布:AI翻译+轻薄设计,重塑人机交互体验

实用指南:【XR硬件系列】影目GO3智能眼镜发布:AI翻译+轻薄设计,重塑人机交互体验pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…