Panda HDU - 4046【树状数组】【一道需要极度细心的题】

  很多博主说这不过是一道树状数组或者线段树的水题,可我并不这么认为,这道题让我更好的理解了关于树状数组的更新函数「uppdate ( )」,所以我觉得这是一道很不错的题,至少在了解树状数组这一块确实如此。

先发一下这题的题面吧(题面有点小清新——如果翻译成中文的话):直接跳转到题目的传送门

(我比较的懒,所以不去看英文,直接上翻译后的文本

问题描述

当我写下这封信时,你可能已经乘飞机去了美国
我们已经知道了15年,这已超过我一生的五分之一。我还记得第一次去看电影时,我们第一次一起去散步。我还记得当你在镜子前穿着时你穿的笑脸。我爱你的笑容和闪亮的眼睛。当你和我在一起时,每一秒都很精彩。
我的期望越多,我就越失望。你说你想去USI我知道你的意思。我尊重你的决定。引力不是坠入爱河的人的责任。我永远是你最好的朋友。我知道方式很难。每一分钟都在想放弃,想着你坚持了这么久的原因,继续坚持下去。每当你有一个糟糕的一天,记住这一点:我爱你。
我会一直等待,直到你回来。看着我的眼睛,你会看到你对我意味着什么。
我生命中有两个最幸运的故事:一个是我爱你的时间。另一个是很久以前我遇到你的那一天。
Saerdna。

它可以追溯到几年前。我还记得你那不成熟的面孔。
桌子下面泛黄的画面可能会唤起无数的记忆。男孩将与女孩保持最后的约会,错过那些年的大雨,错过了那些年的爱情。试图征服世界,却发现最终,你就是世界。我想告诉你我没有忘记。星夜,我会紧紧抱着你。

Saerdna非常喜欢Panda,而且你也知道Panda有两种颜色,黑色和白色。
Saerdna希望与Panda分享他的爱,所以他只用黑白写了一封情书。
情书太长了,熊猫没有那么多时间看完整封信。
但是这封信很容易阅读,因为Saerdna通过使用白色,黑色和白色这三个连续的关键词来隐藏他对这封信的喜爱。
但是Panda并不知道Saerdna在这封信中有多少爱。
你能帮熊猫吗?

 

 

输入

整数T表示测试用例的数量T <= 100 
对于每个测试用例:
第一行是两个整数n,m 
n表示字母的长度,m表示对Panda的查询。n <= 50000,m <= 10000 
下一行有n个字符'b'或'w','b'表示黑色,'w'表示白色。
接下来的m行
每行有两个
类型0:回答L和R之间有多少爱情。(0 <= L <= R <n)
类型1:将第k个字符更改为ch(0 <= k <n和ch是'b'或'w')

 

 

产量

对于每个测试用例,首先输出案例编号。
问题的答案。

 

 

样本输入

 

2 5 2 2 bwbwb 0 0 4 0 1 3 5 5 wbwbw 0 0 4 0 0 2 0 2 4 1 2 b 0 0 4

 

 

样本输出

 

情况1: 1 1 案例2: 2 1 1 0

 

是不是一下子就清新的多了?

 

思路

  这一道题就是去找“wbw”连续字符串的个数——可重复使用一个单词。

那么我们要做的就是题Q你的时候了;这里就要有基础致命伤了,他给你的是从三个数(例如:e1、e2、e3)中的e2开始是从0开始的,我一开始就以为他是从‘1’开始的,所以同时为了避免超数组范围,我输入的字符数组也是从1~n开始的,那么我们就得对e2进行+1处理。

还有就是之后的判断,我们把接下来的那个节点e2开始进行判断,将其放在"wbw"的头、中、尾分别考虑即可——这里还说到了我对树状数组的认识也是在这里,例如你拆散了原本的"wbw",那么就要update(i, -1);以前就以为树状数组只能加,当然这次让我在结构上也理解了树状数组了。

完整代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
using namespace std;
typedef long long ll;
int N,M;
int bit[55005];
char s[50005],ch[3];
bool check(char x, char y, char z)      //查看是否符合条件
{
    return x=='w' && y=='b' && z=='w';
}
int sum(int i)          //返回和
{
    int res=0;
    while(i)
    {
        res+=bit[i];
        i-=lowbit(i);
    }
    return res;
}
void update(int i, int x)           //更新
{
    while(i<=N)
    {
        bit[i]+=x;
        i+=lowbit(i);
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int Case=1; Case<=T; Case++)
    {
        memset(bit, 0, sizeof(bit));
        memset(s, 0, sizeof(s));
        scanf("%d%d%*c",&N,&M);
        scanf("%s",s+1);
        for(int i=3; i<=N; i++)
        {
            if(check(s[i-2], s[i-1], s[i]))
            {
                update(i, 1);
            }
        }
        printf("Case %d:\n",Case);
        while(M--)
        {
            int e1,e2,e3;
            scanf("%d%d",&e1,&e2);
            if(e1==0)
            {
                scanf("%d",&e3);
                if(e3-e2<2) printf("0\n");
                else printf("%d\n",sum(e3+1)-sum(e2+2));
            }
            else
            {
                scanf("%s",ch);
                e2++;
                if(ch[0]==s[e2]) continue;
                if(e2>=1 && e2<=N-2)
                {
                    if(check(ch[0], s[e2+1], s[e2+2]) && !check(s[e2], s[e2+1], s[e2+2])) update(e2+2, 1);
                    if(!check(ch[0], s[e2+1], s[e2+2]) && check(s[e2], s[e2+1], s[e2+2])) update(e2+2, -1);
                }
                if(e2>=2 && e2<=N-1)
                {
                    if(check(s[e2-1], ch[0], s[e2+1]) && !check(s[e2-1], s[e2], s[e2+1])) update(e2+1, 1);
                    if(!check(s[e2-1], ch[0], s[e2+1]) && check(s[e2-1], s[e2], s[e2+1])) update(e2+1, -1);
                }
                if(e2>=3 && e2<=N)
                {
                    if(check(s[e2-2], s[e2-1], ch[0]) && !check(s[e2-2], s[e2-1], s[e2])) update(e2, 1);
                    if(!check(s[e2-2], s[e2-1], ch[0]) && check(s[e2-2], s[e2-1], s[e2])) update(e2, -1);
                }
                s[e2]=ch[0];
            }
        }
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wuliwuliii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值