Spoon Taking Problem(c++题解)

题目描述

�N 人が円卓に座っており,各人は反時計回りに順に 1, …, �1, …, N と番号付けられています.各人はそれぞれ左右どちらか一方の利き手を持っています.

円卓上には 1, …, �1, …, N と番号付けられた計 �N 本のスプーンが,隣り合う二人の間に 11 本ずつ置いてあります.各 1 ≤ � ≤ �1 ≤ i ≤ N について,人 �i の左側,右側にはそれぞれスプーン �i,スプーン (�+1)(i+1) があります.ここで,スプーン (�+1)(N+1) はスプーン 11 のことを指します.

� = 4N = 4 での模式図を以下に示します.

(1, …, �)(1, …, N) の順列 (�1, …, ��)(P1​, …, PN​) が与えられます.�=1,…,�i=1,…,N の順に,人 ��Pi​ が以下のように行動します.

  • 自分の右側または左側にスプーンが残っているならば,そのうち 11 つを取る.
    • このとき自分の両側にスプーンが残っているならば,自分の利き手の側のスプーンを取る.
  • そうでないならば何もしない.

LR? からなる長さ �N の文字列 �S が与えられます.�N 人の利き手の組み合わせは 2�2N 通りありますが,そのうち以下の条件を全て満たすような組み合わせの数を 998244353998244353 で割った余りを求めてください.

  • �S の �i 番目の文字が L ならば,人 �i は左利きである.
  • �S の �i 番目の文字が R ならば,人 �i は右利きである.
  • 全員の行動が終了したとき,全員がスプーンを取っている.

输入格式

入力は以下の形式で標準入力から与えられる.

�N �1P1​ …… ��PN​ �S

输出格式

答えを 11 行に出力せよ.

题意翻译

问题陈述

有 �N 人围坐在一张圆桌旁,按逆时针顺序编号为 11 至 �N 。每个人都有一只优势手:左手或右手。

圆桌上有 �N 个勺子,编号从 11 到 �N ,每对相邻的人中间放一个勺子。在每个 1≤�≤�1≤i≤N 人 �i 的左边和右边,分别有勺子 �i 和 (�+1)(i+1) 。这里,勺子 (�+1)(N+1) 指的是勺子 11 。

下图是 �=4N=4 的示意图。

给定一个 (1,…,�)(1,…,N) 的排列组合 (�1,…,��)(P1​,…,PN​) ,这 �n 个人按照此排列的顺序行动。第 ��Pi​ 个人的行为如下:

  • 如果左侧或右侧有剩余的勺子,他们将拿走其中一个。
    • 如果两边都有剩余的勺子,他们会拿自己惯用手一边的勺子。
  • 否则,他们什么也不会做。

我们还给出了一个长度为 �N 的字符串 �S ,由 LR 和 ? 组成。在 2�2N 种可能的惯用手组合中,求有多少种满足以下所有条件,模数为 998244353998244353 :

  • 如果 �S 的 �i 个字符是 "L",那么 �i 是左撇子。
  • 如果 �S 的第 �i 个字符是 "R",那么 �i 就是右撇子。
  • 当所有人都行动完后,每个人都拿了一个勺子。

输入输出样例

输入 #1复制

3
1 2 3
L??

输出 #1复制

2

输入 #2复制

3
1 3 2
R?L

输出 #2复制

0

输入 #3复制

12
6 2 9 3 1 4 11 5 12 10 7 8
????????????

输出 #3复制

160

说明/提示

制約

  • 入力される数値は全て整数
  • 2 ≤ � ≤ 2 × 1052 ≤ N ≤ 2 × 105
  • (�1, …, ��)(P1​, …, PN​) は (1, …, �)(1, …, N) の順列
  • �S は LR? からなる長さ �N の文字列

Sample Explanation 1

人 1,2,31,2,3 がそれぞれ左利き,左利き,右利きのとき,以下のように行動が行われます. - 人 11 が行動を開始する.人 11 の両側にスプーンが残っているので,人 11 の利き手と同じ左側のスプーン 11 を取る. - 人 22 が行動を開始する.人 22 の両側にスプーンが残っているので,人 22 の利き手と同じ左側のスプーン 22 を取る. - 人 33 が行動を開始する.人 33 の右側にはスプーンが残っておらず,左側にはスプーン 33 が残っているので,スプーン 33 を取る.全員の行動が終了し,このとき全員がスプーンを取っている. この利き手の組み合わせは条件を満たします.他には人 1,2,31,2,3 がそれぞれ左利き,左利き,左利きの場合も条件を満たします.

Sample Explanation 2

条件を満たす利き手の組み合わせが存在しません.

_____________________________________________________________________________

写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

_____________________________________________________________________________

唉...一份超时代码:

#include <bits/stdc++.h>
using namespace std;
long long n,ans;
int a[200005];
int b[200005];//0为左1为右-1为未知 
bool c[200005];//标记 
string s;
bool check(){
	memset(c,0,sizeof(c));
	for(int i=1;i<=n;i++){
		int x=a[i];
		if(x!=n){
			if(c[x]&&c[x+1])return false;
			else if(!c[x]&&!c[x+1])c[x+b[x]]=true;
			else if(!c[x])c[x]=true;
			else if(!c[x+1])c[x+1]=true;
		}else{
			if(c[x]&&c[1])return false;
			else if(!c[x]&&!c[1]){
				if(b[x]==0)c[x]=true;
				else c[1]=true;
			}
			else if(!c[x])c[x]=true;
			else if(!c[1])c[1]=true;
		}
	}
	return true;
} 
void f(int x){
	if(x==n+1){
		if(check())ans=ans%998244353+1;
		return;
	}
	if(b[x]==-1){
		b[x]=1;
		f(x+1);
		b[x]=0;
		f(x+1);
		b[x]=-1;
	}else f(x+1);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	cin>>s;
	int len=s.size();
	for(int i=0;i<len;i++){
		if(s[i]=='L')b[i+1]=0;
		if(s[i]=='R')b[i+1]=1;
		if(s[i]=='?')b[i+1]=-1;
	}
	f(1);
	cout<<ans;
}	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516399.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】详解动态库链接和加载对可执行程序底层的理解

一、动静态库链接的几种情况 如果我们同时提供动态库和静态库&#xff0c;gcc默认使用的是动态库。如果我们非要使用静态库&#xff0c;要加-static选项。如果我们只提供静态库&#xff0c;那可执行程序没办法&#xff0c;只能对该库进行静态链接&#xff0c;但程序不一定整体…

为移动云数据实现基于可撤销属性组的加密:多代理辅助方法

参考文献为2023年发表的Achieving Revocable Attribute Group-Based Encryption for Mobile Cloud Data: A Multi-Proxy Assisted Approach 动机 对于目前的代理辅助的可撤销基于属性加密来说&#xff0c;外包解密存一些缺点。当多个具有相同属性的用户请求外包转换时&#x…

核心API-Activiti7从入门到专家(3)

背景 今天的说的api&#xff0c;activiti7真有&#xff0c;但真不是这个&#xff1a; 这个是为了云服务&#xff0c;封装的一些api&#xff0c;以后我们还会逐步探讨&#xff0c;今天我们讨论的&#xff0c;是其真正的api&#xff0c;以前是这样的&#xff1a; 是的&#xff0…

ChatGPT 登陆报错:“Oops, an error occurred!” 如何解决?

ChatGPT登录时报错&#xff1a;“Oops, an error occurred!” 说明&#xff1a;哎呀&#xff0c;出错了! 原因&#xff1a; 目前出现这个情况的小伙伴&#xff0c;并非账号被封&#xff0c;多是服务端的问题&#xff0c;比如高峰段&#xff0c;服务端响应不及时&#xff0c;负…

[Apple Vision Pro]开源项目 Beautiful Things App Template

1. 技术框架概述&#xff1a; - Beautiful Things App Template是一个为visionOS设计的免费开源软件&#xff08;FOSS&#xff09;&#xff0c;用于展示3D模型画廊。 2. 定位&#xff1a; - 该模板作为Beautiful Things网站的延伸&#xff0c;旨在为Apple Vision Pro用户…

leetcode代码记录(打家劫舍 III

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xf…

【数据结构】——二叉树的递归实现,看完不再害怕递归

创作不易&#xff0c;感谢三连加支持&#xff1f;&#xff01; 一 递归理解 递归无非就是相信它&#xff0c;只有你相信它&#xff0c;你才能写好递归&#xff01;为什么&#xff1f;请往下看 在进入二叉树的实现之前&#xff0c;我们得先理解一遍递归&#xff0c;可能很多…

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

网络基础二——TCP可靠性实现机制补充

11.3.4确认应答机制 ​ 1.双方通信时要返回确认应答报文&#xff0c;保证对方发送的报文是有效的&#xff1b;尽管整个通信过程中无法保证数据全部可靠&#xff0c;但是可以保证单个方向发送的数据是可靠的&#xff1b; ​ 发送的报文要设置序号&#xff0c;如果是应答报文要…

腾讯云容器与Serverless的融合:探索《2023技术实践精选集》中的创新实践

腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践 文章目录 腾讯云容器与Serverless的融合&#xff1a;探索《2023技术实践精选集》中的创新实践引言《2023腾讯云容器和函数计算技术实践精选集》整体评价特色亮点分析Serverless与Kubernetes的…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…

设计模式总结-面向对象设计原则

面向对象设计原则 面向对象设计原则简介单一职责原则单一职责原则定义单一职责原则分析单一职责原则实例 开闭原则开闭原则定义开闭原则分析开闭原则实例 里氏代换原则里氏代换原则定义里氏代换原则分析 依赖倒转原则依赖倒转原则定义依赖倒转原则分析依赖倒转原则实例 接口隔离…

React 入门

一、官网地址 英文官网: https://reactjs.org/中文官网: https://react.docschina.org/ 二、React 特点 声明式编码组件化编码React Native 编写原生应用高效&#xff08;优秀的 Diffing 算法&#xff09;高效的原因&#xff1a;1.使用虚拟DOM&#xff0c;不总是直接操作页面…

Navicat Premium 16 Mac/win---数据库设计、管理与维护轻松掌握数据库管理精髓

Navicat Premium是一款功能强大的数据库开发工具&#xff0c;支持多种数据库系统&#xff0c;如MySQL、Redis、MariaDB、Oracle等&#xff0c;并可与云数据库兼容&#xff0c;如Amazon RDS、Microsoft Azure等。它提供了直观易用的用户界面&#xff0c;使得开发者能够轻松上手并…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…

基于单片机的无线红外报警系统

**单片机设计介绍&#xff0c;基于单片机的无线红外报警系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的无线红外报警系统是一种结合了单片机控制技术和无线红外传感技术的安防系统。该系统通过无线红外传感器实…

思通数科:利用开源AI能力引擎平台打造企业智能搜索系统

在信息爆炸的时代&#xff0c;如何高效地管理和检索海量数据已成为企业和个人面临的一大挑战。思通数科 StoneDT 多模态AI能力引擎平台&#xff0c;以其强大的自然语言处理&#xff08;NLP&#xff09;、OCR识别、图像识别和文本抽取技术&#xff0c;为用户带来了前所未有的智能…

UE4 C++获取Niagara变量值

UE4 获取Niagara变量值 Niagara有一堆Get方法&#xff0c;但是是基于数据的&#xff0c;单独的Set方法是有的&#xff0c;因此&#xff0c;我们这参考Set源码去Get 源代码如下&#xff1a; 我们的实现&#xff08;当然要返回其他类型值&#xff0c;修改一下对应传参就行了…

一个简单的Demo展示fastapi+tortoise-orm+celery如何搭配

1. 创建并激活虚拟环境 python3 -m venv venv source venv/*/activate 2. 安装依赖包 pip install fastapi uvicorn[standard] tortoise-orm celery[redis] fastapi-cdn-host 3. 配置数据库连接参数 - config.py from typing import TypedDictclass TortoiseInitParam(Ty…

【C语言】翻译环境与运行环境

一、前言 在我们学习C语言的时候&#xff0c;第一个接触的程序就是&#xff1a;在屏幕上打印” hello word! “&#xff0c;可当时的我们却未去深入的理解与感悟&#xff0c;一个程序代码是如何运行的&#xff1b;而这一期的博客&#xff0c;则是带着我们&#xff0c;通过C代码…