2023NOIP A层联测28 T4 小猫吃火龙果

分块题,跟赛时的一个倍增部分分做法很像。

思路

如果没有动态操作,可以设 \(dp[i][T][k]\) 为:在 \(i\) 时为 \(T(T\in{\{A,B,C}\})\),算上 \(i\) 向前 \(2^k\) 步得到的字符。

转移:

\[dp[i][T][k]=dp[i+2^k-1][dp[i][T][k-1]][k-1]
\]

特别的,当 \(k=0\) 时,\(dp[i][T][0]\) 需要特别赋值。

这个做法提供了一个很好的想法,可以钦定到一个点时的字符,向后跳若干步时直接得到该步的答案。

加上动态操作,可以分块去做。

对于每一个块,我们把钦定的字符后,块内的点的每 6 种变化情况所造成的不同的答案都记录下来。

对于每一个更改操作,整块直接更改该块的变化情况编号;零散块暴力更改后,再次暴力维护块内的各项数据。

对于每一个查询,零散块暴力跳,整块直接跳一块答案,每次可以按照类似于 dp 做法的方式维护答案。

CODE

#include<bits/stdc++.h>
using namespace std; const int maxn=2e5+5; int n,m,block;
int to[maxn][6][3],t[2000]; int c[6][3]={{0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,0,1},{2,1,0}};
int b[6][3]={{2,5,1},{3,4,0},{0,3,4},{1,2,5},{5,1,2},{4,0,3}}; char a[maxn]; set< pair<int,int> >s; int gt(int now,int x){return now==(x+1)%3?x:now;} void renew(int id)
{
int l=id*block+1,r=min(l+block-1,n);
for(int i=l;i<=r;i++) a[i]=c[t[id]][a[i]-'A']+'A';
t[id]=0;
}
void updata(int id)
{
int l=id*block+1,r=min(l+block-1,n);
for(int x=0;x<6;x++)
{
for(int y=0;y<3;y++)
{
to[id][x][y]=y;
for(int i=l;i<=r;i++) to[id][x][y]=gt(to[id][x][y],c[x][a[i]-'A']);
}
}
} int main()
{
scanf("%d%d",&n,&m);
cin>>a+1;
block=sqrt((n+17)/18);
for(int i=0;i<=(n+block-1)/block;i++) updata(i);
for(int i=1;i<=m;i++)
{
int op,l,r;
char t1,t2;
cin>>op>>l>>r>>t1;
if(op==0)
{
cin>>t2;
if(t1==t2) continue;
if(t1>t2) swap(t1,t2);
int tp=(t1=='A'?t2=='B'?0:1:2);
int idl=(l-1)/block;
int idr=(r-1)/block;
if(idl==idr)
{
renew(idl);
for(int j=l;j<=r;j++)
{
if(a[j]==t1) a[j]=t2;
else if(a[j]==t2) a[j]=t1;
}
updata(idl);
}
else
{
renew(idl);
for(int j=l;j<=idl*block+block;j++)
{
if(a[j]==t1) a[j]=t2;
else if(a[j]==t2) a[j]=t1;
}
updata(idl);
for(int j=idl+1;j<=idr-1;j++) t[j]=b[t[j]][tp];
renew(idr);
for(int j=idr*block+1;j<=r;j++)
{
if(a[j]==t1) a[j]=t2;
else if(a[j]==t2) a[j]=t1;
}
updata(idr);
}
}
else
{
int idl=(l-1)/block;
int idr=(r-1)/block;
t1-='A';
if(idl==idr)
for(int j=l;j<=r;j++) t1=gt(t1,c[t[idl]][a[j]-'A']);
else
{
for(int j=l;j<=idl*block+block;j++) t1=gt(t1,c[t[idl]][a[j]-'A']);
for(int j=idl+1;j<=idr-1;j++) t1=to[j][t[j]][t1];
for(int j=idr*block+1;j<=r;j++) t1=gt(t1,c[t[idr]][a[j]-'A']);
}
cout<<(char)(t1+'A')<<"\n";
}
}
}

2023NOIP A层联测28 T4 小猫吃火龙果的更多相关文章

  1. 使用T4模板生成代码的学习

    之前做项目使用的都是Db First,直接在项目中添加Entity Framework,使用T4模板(T4模板引擎之基础入门)生成DAL BLL层等(T4模板是一个同事给的,也没有仔细研究,代码如下: ...

  2. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  3. python迭代器,生成器

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...

  4. python基础-迭代器和生成器

    一.递归和迭代 1.递归:(问路示例) 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 2.迭代:简单理 ...

  5. 数据挖掘系列(9)——BP神经网络算法与实践

    神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...

  6. VS2010+MVC4+Spring.NET2+NHibernate4-传统三层架构-前篇

    VS2010+MVC4+Spring.NET2+NHibernate4 - 传统三层架构 - 前篇 一直追求使用开源项目,就因一个字:懒! 一直想整理一下的,却一直懒到现在!从当初用的MVC3到现在的 ...

  7. 基于jquery的表格动态创建,自动绑定,自动获取值

    最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...

  8. Text Template Transformation Toolkit

    Text Template Transformation Toolkit       1.且算简介         笔者以一个英文字母和一个数字取了一个简单的名字.名唤"T4"(名 ...

  9. javaweb学习总结(四十四)——监听器(Listener)学习

    一.监听器介绍 1.1.监听器的概念

  10. Vijos1523 NOI2002 贪吃的九头龙 树形dp

    思路不算很难,但细节处理很麻烦 前面建图.多叉转二叉,以及确定dp处理序列的过程都是套路,dp的状态转移过程以注释的形式阐述 #include <cstdio> #include < ...

随机推荐

  1. Adobe Photoshop cc2022 Mac中文破解版下载 支持intel/M1/M2/M3

    Adobe Photoshop cc2022 Mac版,支持intel.M1.M2.M3芯片,全系都能使用,最低系统需求:11.0以上.建议安装此版本或者ps2024版本. 下载地址放到最后,先来看安 ...

  2. Html 使用scss爆红

      使用     <style  lang="less" scoped> </style>   即可      

  3. 报错解决:partially initialized module 'charset_normalizer' has no attribute 'md__mypyc' (most likely due to a circular import)

    在运行jupyter 时候报错'partially initialized module 'charset_normalizer' has no attribute 'md__mypyc' (most ...

  4. 新手入门 | 搭建 AI 模型开发环境

    目录 安装显卡驱动和开发库 对于 Tesla 系列显卡 对于 N 卡 安装 CUDA 和 cuDNN 安装 Miniconda 安装 PyTorch 和 Transformers 使用 Modelsc ...

  5. RabbitMQ核心概念以及工作原理【转】

    RabbitMQ核心概念以及工作原理 我们来看看流行的RabbitMQ消息系统以及它是如何让你的系统之间进行解耦的. 英文原文   RabbitMQ 在这篇短文里,我们会介绍什么是RabbitMQ,它 ...

  6. 《SpringCloud微服务之间相互调用》之Feign实战

    一.场景再现 假设我们有这样一个场景: 用户付款成功后,扣除用户金额,还要减少仓库数量.按照微服务的设计理念,用户具有至少以下3个服务(项目): 1.订单 2.账户 3.仓库 微服务之间都是相互独立的 ...

  7. tarjan—算法的神(一)

    本篇包含 tarjan 求强连通分量.边双连通分量.割点 部分, tarjan 求点双连通分量.桥(割边)在下一篇. 伟大的 Robert Tarjan 创造了众多被人们所熟知的算法及数据结构,最著名 ...

  8. 深入理解JavaScript中的箭头函数

    箭头函数可以使我们的代码更加简洁,如下: var sum = (a,b) => a+b; JavaScript 充满了我们需要编写在其他地方执行的小函数的情况. 例如: arr.forEach( ...

  9. ChatGPT正式登陆iOS平台

    6天前,ChatGPT在美区App Store中上架了官方App,累计下载量已经突破 50 万次,OpenAI 的 ChatGPT 应用在上架之后,其热度远超必应聊天等聊天机器人,以及其它使用 GPT ...

  10. 七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)

    七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用) @ 目录 七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用) ...