wannafly25 E 01串
链接 wannafly25 E 01串
- 给出一个\(01\)串,有两种操作,操作一是将某一个位置的数字修改,操作二是询问某一个区间,将这个区间看做\(1\)个二进制数,可以随意加减\(2\)的幂次,问将这个数变为\(0\)的最小操作步数,\(n,q\leq 3*10^5\)。
- 动态dp,线段树优化\(dp\)。
- 设\(f_{i,01}\)表示当前在\(i\)号点,是否有进位的最小步骤,转移大力讨论。
- 把每个转移看作一个\(2*2\)的矩阵,实际上一个\(Dp\)就是一堆矩阵的和,线段树维护矩阵和和单点修改即可。
- 转移$$f_{i,j}=min(f_{i,0}+f_{0,j},f_{i,1}+f_{1,j})$$
- 初始条件$$f_{0,0}=x,f_{1,1}=!x,f_{1,0}=f_{0,1}=1$$
- 复杂度\(O(nlogn)\)
#include<bits/stdc++.h>
#define R register int
using namespace std;
const int N=300001;
int n,q,w[N],Le[N*4],Ri[N*4];char S[N];
int gi(){
R x=0,k=1;char c=getchar();
while(c!='-'&&(c<'0'||c>'9'))c=getchar();
if(c=='-')k=-1,c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*k;
}
struct Mar{
int s[2][2];
void init(R x){
s[0][0]=x,s[1][1]=(!x);
s[1][0]=s[0][1]=1;
}
}z,te[N*4];
Mar operator + (Mar x,Mar y){
for(R i=0;i<=1;++i)
for(R j=0;j<=1;++j)
z.s[i][j]=min(x.s[i][0]+y.s[0][j],x.s[i][1]+y.s[1][j]);
return z;
}
void build(R le,R ri,R i){
Le[i]=le,Ri[i]=ri;
if(le==ri){te[i].init(w[le]);return ;}
R mid=(Le[i]+Ri[i])>>1,ls=(i<<1),rs=(ls|1);
build(le,mid,ls),build(mid+1,ri,rs);
te[i]=te[ls]+te[rs];
}
Mar quy(R le,R ri,R i){
if(Le[i]==le&&Ri[i]==ri)return te[i];
R mid=(Le[i]+Ri[i])>>1,ls=(i<<1),rs=(ls|1);
if(ri<=mid)return quy(le,ri,ls);
else if(le>mid)return quy(le,ri,rs);
else return quy(le,mid,ls)+quy(mid+1,ri,rs);
}
void mdf(R pos,R v,R i){
if(Le[i]==Ri[i]){w[pos]=v,te[i].init(v);return ;}
R mid=(Le[i]+Ri[i])>>1,ls=(i<<1),rs=(ls|1);
if(pos<=mid)mdf(pos,v,ls);else mdf(pos,v,rs);
te[i]=te[ls]+te[rs];
}
int main(){
n=gi(),scanf("%s",S+1);
for(R i=1;i<=n;++i)w[i]=S[i]-'0';
build(1,n,1),q=gi();
while(q--){
R op=gi(),u=gi(),v=gi();
if(op==1)printf("%d\n",quy(u,v,1).s[0][0]);
else mdf(u,v,1);
}
return 0;
}
wannafly25 E 01串的更多相关文章
- JZOJ P1847:找01串
传送门 DP预处理+贪心 首先设$f[i][j]$表示长度为$i$的01串中有不大于$j$个1,然后显然 $f[i][j]=\sum_{k=1} ^{j} C[i][k]$ $C[i][j]=C[i- ...
- 洛谷P2727 01串 Stringsobits
P2727 01串 Stringsobits 24通过 55提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 这题的思路是啥啊!!!跪求- 题目背景 考虑 ...
- C++实现01串排序
题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...
- 01串(dp)
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...
- 【巧妙】【3-21个人赛】Problem C 01串
Problem C Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Sub ...
- NYOJ-252 01串
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这样的长 ...
- NYOJ 252 01串(斐波那契数列变形)
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...
- COGS 862. 二进制数01串【dp+经典二分+字符串】
862. 二进制数01串 ★ 输入文件:kimbits.in 输出文件:kimbits.out 简单对比 时间限制:1 s 内存限制:128 MB USACO/kimbits(译 by ...
- 1415: 小ho的01串 [字符串]
点击打开链接 1415: 小ho的01串 [字符串] 题目描述 有一个由0和1组成的字符串,它好长呀--------一望无际 恩,说正题,小ho的数学不太好,虽然是学计算机的但是看见0和1也是很头疼的 ...
随机推荐
- hashcode native
hashcode Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值. 在设计hashCode方法和equal ...
- win7下面安装flex和bison
通过Cygwin工具进行安装 下载地址cygwin 安装截图: 搜索flex,选择相应的版本进行安装 搜索bison 然后下一步 安装完成后,将D:\cygwin64\bin路径添加到PATH环境变量 ...
- mysql 无法远程连接 没有监听端口
centos yum安装mysql: 远程连接完成用户授权和防火墙配置,可还是连接不上. 发现mysql没有监听3306端口. 修改mysql配置文件 vi /etc/my.conf 注释掉以下行,重 ...
- 背包&数位dp(8.7)
背包 0/1背包 设dp[i][j]为前i个物品选了j体积的物品的最大价值/方案数 dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j])(最大价值) dp[i][ ...
- Docker - 部署 Ant Design Pro 的项目
解读 Ant Design Pro 的 Docker 配置 package.json 的 scripts -f: 使用什么配置文件 -t: 标签 up: 启动服务(的容器) build: 构建或重新构 ...
- c# Thread——1.为什么Abort中断线程是不可靠的
Thread.Abort 方法在c#中用作强制中断线程的执行,大多用于线程内部满足某个特定条件而自己调用关闭自身,比如下面的代码在i自增到3的时候就会停止打印. class Program { sta ...
- altium笔记转载
原理图的设计 1.左键单击元器件按住space键可以将其旋转,按X键左右旋转:按Y键上下旋转. 2.智能粘贴:Edit àsmart paste . 3.屏障:compile mask(编译时被屏障的 ...
- JMeter性能测试入门-不同类型线程组的使用
jmeter不同线程组的详解 在做性能测试之前,我们来了解一下JMeter多个不同线程组的应用.首先,JMeter提供了三个基本的线程组,分别为: Thread Group setUp Thread ...
- js导入外部文件
- UDP信号驱动IO
SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提 ...