NOIP2023模拟16联测37 D. 小猫吃火龙果

2023-11-10 22:53

本文主要是介绍NOIP2023模拟16联测37 D. 小猫吃火龙果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NOIP2023模拟16联测37 D. 小猫吃火龙果

文章目录

  • NOIP2023模拟16联测37 D. 小猫吃火龙果
    • 题目大意
    • 思路
    • code

题目大意

n n n 个物品 A A A , B B B , C C C A A A B B B B B B C C C C C C A A A,有两种操作,给 [ l , r ] [ l , r ] [l,r] x , y x , y x,y 互换,求出经过操作后得出什么。

n , m ≤ 2 × 1 0 5 n , m \le 2\times10^5 n,m2×105

思路

分块

维护一个状态 c i c_i ci 表示这个块的 A , B , C A , B , C A,B,C 分别变成了什么。

再维护一个 t o i d , x , y to_{id , x , y} toid,x,y i d id id 块,状态为 x x x,把 y y y 带进去会带出来什么。

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define get_next(now , x) (now == (x + 1) % 3 ? x : now)
using namespace std;
const int N = 2e5 + 5;
int n , m , a[N] , block , to[N][6][3] , t[N];
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}};
inline int read () {char ch = getchar ();while (ch != 'A' && ch != 'B' && ch != 'C') ch = getchar ();return ch - 'A';
}
// inline int get_next (int now , int x) {
//     if (now == (x + 1) % 3) return x;
//     else return now;
// }
inline void updata (int id) {int l = id * block + 1 , r = min ((id + 1) * block , n);fu (i , 0 , 5) {fu (j , 0 , 2) {to[id][i][j] = j;fu (k , l , r) to[id][i][j] = get_next (to[id][i][j] , c[i][a[k]]);}}
}
inline void renew (int id) {int l = id * block + 1 , r = min ((id + 1) * block , n);fu (i , l , r) a[i] = c[t[id]][a[i]];t[id] = 0;
}
inline int rd () {int val = 0;char ch = getchar ();while (ch < '0' || ch > '9') ch = getchar ();while (ch >= '0' && ch <= '9') {val = val * 10 + (ch - '0');ch = getchar ();}return val;
}
int main () {freopen ("training.in" , "r" , stdin);freopen ("training.out" , "w" , stdout);int x , y , l , r , op , minr , id , type;n = rd () , m = rd ();fu (i , 1 , n) a[i] = read ();if(n>100)block = sqrt (n / 12);else block=sqrt(n);fu (i , 0 , (n + block - 1) / block) updata (i);while (m --) {op = rd () , l = rd () , r = rd ();if (op) {x = read ();id = (l - 1) / block;minr = min ((l - 1) / block * block + block , r);while (l <= minr) {x = get_next (x , c[t[id]][a[l]]);l ++;}while (l <= r - block + 1) {id = (l - 1) / block;x = to[id][t[id]][x];l += block;}id = (l - 1) / block;while (l <= r) {x = get_next (x , c[t[id]][a[l]]);l ++;}printf ("%c\n" , x + 'A');}else {x = read () , y = read ();if (x == y) continue;if (x > y) swap (x , y);id = (l - 1) / block;minr = min ((l - 1) / block * block + block , r);type = (x == 0 ? y == 1 ? 0 : 1 : 2);renew (id);while (l <= minr) {if (a[l] == x) a[l] = y;else if (a[l] == y) a[l] = x;l ++;}updata (id);while (l <= r- block + 1) {id = (l - 1) / block;t[id] = b[t[id]][type];l += block;}renew (id = (l - 1) / block);while (l <= r) {if (a[l] == x) a[l] = y;else if (a[l] == y) a[l] = x;l ++;}updata (id);}}return 0;
}

这篇关于NOIP2023模拟16联测37 D. 小猫吃火龙果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/385809

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><