题意:

      给一个字符串,两种操作 0 a b 询问a,b之间有多少个wbw, 1 a c 就是把第a个改成c.

思路:

      这个题目我们可以用线段树的点更新来做,一开始写了个好长好长的线段树,pushup写了很长,每个节点7个变量,结果  "呵呵"。其实根本不用那么麻烦,我当时想的麻烦了,每个节点只有一个sum就行了,每个节点代表的是以当前这段的每个点为终点的wbw的个数,比如节点4,6那么当前的这个节点存的就是以4,5,6,为终点的wbw的个数(4,6最多三个),每次更新的时候改变当前的这个字母可能会影响三个权值改变,所以更新三次,具体看代码。


#include<stdio.h>
#include<string.h> #define lson l ,mid ,t << 1
#define rson mid + 1 ,r ,t << 1 | 1

int
sum[300000];
char
num[55000]; void Pushup(int t)
{

sum[t] = sum[t<<1] + sum[t<<1|1];
} void
BuidTree(int l ,int r ,int t)
{

sum[t] = 0;
if(
l == r)
{
if(
l >= 3 && num[l] == 'w' && num[l-1] == 'b' && num[l-2] == 'w')
sum[t] = 1;
return ;
}
int
mid = (l + r) >> 1;
BuidTree(lson);
BuidTree(rson);
Pushup(t);
} void
Update(int l ,int r ,int t ,int a)
{
if(
l == r)
{
if(
num[l] == 'w' && num[l-1] == 'b' && num[l-2] == 'w')
sum[t] = 1;
else
sum[t] = 0;
return;
}
int
mid = (l + r) >> 1;
if(
a <= mid) Update(lson ,a);
else
Update(rson ,a);
Pushup(t);
} int
Query(int l ,int r ,int t ,int a ,int b)
{
if(
a <= l && b >= r)
return
sum[t];
int
mid = (l + r) >> 1;
int Ans = 0;
if(
a <= mid) Ans = Query(lson ,a ,b);
if(
b > mid) Ans += Query(rson ,a ,b);
return
Ans;
} int main ()
{
int
t ,n ,m ,a ,b ,c ,cas = 1;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
scanf("%s" ,num + 1);
BuidTree(1 ,n ,1);
printf("Case %d:\n" ,cas ++);
while(
m--)
{

scanf("%d" ,&a);
if(!
a)
{

scanf("%d %d" ,&b ,&c);
b ++ ,c ++;
if(
c - b < 2) printf("0\n");
else
printf("%d\n" ,Query(1 ,n ,1 ,b + 2 ,c));
}
else
{
char
str[5];
scanf("%d %s" ,&b ,str);
num[++b] = str[0];
if(
b >= 3) Update(1 ,n ,1 ,b);
if(
b + 1 >= 3 && b + 1 <= n) Update(1 ,n ,1 ,b + 1);
if(
b + 2 >= 3 && b + 2 <= n) Update(1 ,n ,1 ,b + 2);
}
}
}
return
0;
}

hdu4046 不错的线段树单点更新的更多相关文章

  1. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  2. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  3. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  4. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  6. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

  7. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  8. HDUOJ----1166敌兵布阵(线段树单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

随机推荐

  1. jQuery实现全网热播视频

    <section id="play"> <h1>全网热播视频</h1> <ul> <li><img src=&qu ...

  2. 部分rpm包总结描述

    acl-2.2.51-15.el7.x86_64 Commands for Manipulating POSIX(可移植操作系统接口 of unix) Access Control Lists.有ge ...

  3. docker配置私有镜像仓库-registry和hyper/docker-registry-web

    1.前言️​ Docker hub是远程仓库,是国外的,push pull速度特别慢,尤其是网速不好的时候,页面都点不进去,官网 但是可以配置阿里云镜像加速哦: 因此搭建一个私有的镜像仓库用于管理我们 ...

  4. 关于深度学习配置的一些tips

    建立博客的第一天,将以前记录的一些东西存档下,方便查看. 1安装anaconda 2pycharm破解 配置环境变量3虚拟环境推荐是python3.5或3.6版本 4.安装numpy tensorfl ...

  5. CSS水平布局

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  6. linux搭建gtk的开发环境

    1:在终端中运行以下命令: sudo apt-get install libgtk2.0-dev 2:用以下指令查看是否安装成功: pkg-config --cflags --libs gtk+-2. ...

  7. 颠覆你认知的Python3.9

    我通读了python 3.9发行说明和相关的讨论.根据这些信息,我想写一个全面的指南,以便每个人都能一眼了解这些功能及其详细的工作原理 原文地址,点击这里,观看效果更佳 简而言之 从字典更新/合并到添 ...

  8. Mybatis中由于${}直接注入引发的问题

    一.问题引入 我们先来看这段代码,我想从取值为${category}的表中查询全部信息. @Mapper public interface CategoryMapper { @Select(" ...

  9. 封装一个postMessage库,进行iframe跨域交互

    这是近期个人在开发chrome插件时的其中一个小总结.还有很多没有总结出来.因为目前插件还在迭代中,(herry菌插件,用于B站C站),属于个人业余的一个小项目.还有很多功能没有实现,以及还需要再看能 ...

  10. C# 8.0 宝藏好物 Async streams

    之前写<.NET gRPC 核心功能初体验>,利用gRPC双向流做了一个打乒乓的Demo,存储消息的对象是IAsyncEnumerable<T>,这个异步可枚举泛型接口支撑了g ...