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也是很头疼的 ...
随机推荐
- CTEX WinEdt 改变默认 pdf viewer
CTEX 2.9.2, WinEdt 7.0 "Options" -> "Excution Modes..." -> "PDF viewe ...
- SpringBoot设置SORS的几种方式
1. 原生支持 Application 启动类添加以下代码: import org.springframework.context.annotation.Bean;import org.springf ...
- Maven的一些常用命令
将本项目的源码部署到本地仓库 mvn clean source:jar install 将本地jar包部署到本地仓库,首先将jar包放在当前目录下,然后执行,这样做比直接把jar包copy到本地仓库更 ...
- 阶段1 语言基础+高级_1-2 -面向对象和封装_14private关键字的作用及使用
新建一个类Person代表人 创建demo03Person类去调用Person这个类 年龄设置为负数.虽然可以设置为负数.但是这个数值不合理 外部访问这个age就会报错 负数设置不进来.正数也设置不了 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_07 Collections工具类_1_Collections集合工具类的方法
这是一个个的添加的方式 参数是个可变的元素.可以传递任意多的元素 shuffle打乱集合元素顺序
- eclipse 背景绿豆沙颜色
General -> Editors -> Text Editors -> Appearance color options -> Background color 色调:85 ...
- Vue Router:使用 props 将组件和路由解耦
在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性. 可以使用 props 将组件和路由解耦. 一 路由配置(布尔模式): impo ...
- js数组,运算符
- mooc-IDEA 项目/文件之间跳转--002
二.IntelliJ IDEA -项目之间跳转 1.Next Project Window :跳转到下一个项目 [ ctrl+alt+) ] 2.Previous Project Window:跳转到 ...
- ceph部署-集群建立
一.配置storage集群1.建立集群管理目录(管理配置文件,密钥)mkdir ceph-clustercd ceph-cluster/ 2.创建一个新集群(需要先将主机名加入/etc/hosts 必 ...