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也是很头疼的 ...
随机推荐
- 修改docker默认网段
一. 修改普通docker run启动的容器的网段 https://blog.51cto.com/13670314/2345518?source=dra https://blog.csdn.net/w ...
- leetcode-mid-Linked list- 230 Kth Smallest Element in a BST
mycode 81.40% # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x ...
- SpringBoot设置SORS的几种方式
1. 原生支持 Application 启动类添加以下代码: import org.springframework.context.annotation.Bean;import org.springf ...
- floding regions
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_10 斗地主案例(双列)_1_斗地主案例的需求分析
之前做的斗地主的版本,没有从小到大进行排序 一个存储牌的花色,一个存储牌的序号. 放牌的容器.使用Map 再创建一个集合进行洗牌. 调用shuffer方法洗牌.生成后就是随即的索引了.
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_1_线程状态概述
Thread中有个嵌套类 它描述了线程的状态 线程状态的图 Object类中的Wait方法和notify方法
- python读写ini配置文件
像邮箱等信息是可以写在配置文件里面的,python有一个配置模块ConfigParser,可以处理配置文件信息 目录 1.配置模块ConfigParser 2.基本应用 1.配置模块ConfigPar ...
- C# 保留N位小数
1.只要求保留N位不四舍五入 float f = 0.55555f; int i =(int)(f * 100); f = (float)(i*1.0) ...
- 前端 CSS的继承性
css有两大特性:继承性和层叠性 继承性 继承:给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 记住:有一些属性是可以继承下来 : color . font-*. text- ...
- 两道CTF Web的题目
1.easyphp 1.1.题目描述 题目首先是一张不存在的图片 查看源码发现只有一句话 <img src="show.php?img=aGludC5qcGc=" width ...