AtCoder Regular Contest 175(A~B)

补题:A - Spoon Taking Problem

阅读理解就能劝退好多人,先看B题可能收益会更高。

N个人都是这么坐的,勺子标号也给你标好了。

如果 s[1]=L,那么1这个人就要拿左边的勺子,如果左边没有就拿右边的,右边也没有就无解。

s[1]=R,也同理

如果s[1]=?,那么代表这个人左手和右手由我们来决定。

如果第一个人拿了右边,那么接下来所有人都必须拿右边,否则一定无解。

那么考虑s[1]=?,如果有一开始拿的是右边,而且轮到?的这个人,只有右边这个勺子,那么这个人是左手和右手都没有关系,总方案就会*2

然后模拟所有情况。

注意给了p序列决定了拿勺子的顺序,所以第一个人 s[p[1]],不是s[1]

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;
const int N=2e5+5,MOD=998244353;

int n,p[N];
string s;

int doL(){
    int ans=1;

    bool vis[n+5];
    per(i,0,n+1)vis[i]=false;
    vis[0]=vis[n+1]=true;
    vis[p[1]]=true;

    per(i,2,n){
        //接下来都拿左手
        int l=p[i],r=p[i]+1;
        if(r==n+1)r=1;

        if(vis[l] and vis[r]){//没勺子拿了
            return 0;
        }else
        if(!vis[l] and !vis[r]){//两个勺子都还在
            if(s[l]=='R'){//拿右无解
                return 0;
            }//剩下情况都拿左手
            vis[l]=true;
        }else
        if(!vis[l]){//只有左勺子
            vis[l]=true;
            if(s[l]=='?'){
                ans*=2;
                ans%=MOD;
            }
        }else{//只有右勺子
            return 0;
        }
    }

    return ans;
}

int doR(){
    int ans=1;

    bool vis[n+5];
    per(i,0,n+1)vis[i]=false;
    vis[0]=vis[n+1]=true;
    if(p[1]+1==n+1)vis[1]=true;
    else vis[p[1]+1]=true;

    per(i,2,n){
        //接下来都拿右手
        int l=p[i],r=p[i]+1;
        if(r==n+1)r=1;

        if(vis[l] and vis[r]){//没勺子拿了
            return 0;
        }else
        if(!vis[l] and !vis[r]){//两个勺子都还在
            if(s[l]=='L'){//拿左无解
                return 0;
            }//剩下情况都拿右手
            vis[r]=true;
        }else
        if(!vis[r]){//只有右勺子
            vis[r]=true;
            if(s[l]=='?'){
                ans*=2;
                ans%=MOD;
            }
        }else{//只有左勺子
            return 0;
        }
    }

    return ans;
}

void solve(){
    cin>>n;
    per(i,1,n)cin>>p[i];
    cin>>s;
    s="0"+s;

    int ans;
    if(s[p[1]]=='L')ans=doL();
    else if(s[p[1]]=='R')ans=doR();
    else ans=doL()+doR();

    cout<<ans%MOD<<endl;
}

signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr);
    int t=1;
    while(t--)solve();
    return 0;
}

B - Parenthesis Arrangement

给你一个括号序列S,你可以进行两个操作:

1、交换 s[i],s[j]    花费 A

2、修改 s[i] 成为 '(' 或者 ')'     花费B

输出最少的花费,使得括号序列S成为合法的括号序列(每一个左括号都对应一个右括号)

首先,已经合法的括号就不需要修改了,这样的操作是多余的。

遍历括号序列,进栈,如果遇到栈顶是 '(',当前是 ')',那就弹出栈顶,否则当前入栈(去除合法括号)

然后就会剩下 ①(((((  或者 ②))))))  或者 ③))(((( 这三种情况。

显然①和②只能修改一半使序列合法。

③交换一次相当于修改两个位置。如果 a<=2*b,我们一定要先执行交换操作。

模拟一下若有 ))((((,交换一次 ()(((),显然一次交换产生了两对合法的,而不是一对。

交换完毕之后如果还有剩下的,((((,那么只需要将一半翻转。

如果a>2*b,那么我们只能翻转。

)))(((,左半边翻转一半,右半边翻转一半,如果是奇数还剩下两个括号 )(,那么还需要再翻两遍。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;

//交换 i,j 花费 A
//把 i 换成 (或者) 花费B

//最少花费,让S变成合法的括号序列


void solve(){
    int n,a,b;
    cin>>n>>a>>b;
    string s;
    cin>>s;

    stack<char>sta,sta1;
    sta.push(s[0]);
    per(i,1,s.length()-1){
        if(sta.size() and sta.top()=='(' and s[i]==')'){
            sta.pop();
        }else{
            sta.push(s[i]);
        }
    }

    int c9=0,c0=0;
    while(sta.size()){
        if(sta.top()=='(')c9++;
        else c0++;
        sta1.push(sta.top());
        sta.pop();
    }

    int ans=0;
    if(c9==0 or c0==0){
        ans=(c9+c0)/2*b;
    }else{
        //  )))(((((

        if(a<=2*b){
            ans=(min(c0,c9)+1)/2*a+(max(c0,c9)-min(c0,c9))/2*b;
        }else{//全部修改
            if(c0&1){
                ans=(c0/2+c9/2+2)*b;
                // )(
            }else{//偶数
                ans=(c0/2+c9/2)*b;
            }
        }
    }

    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr);
    int t=1;
    while(t--)solve();
    return 0;
}

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

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

相关文章

[AutoSar]BSW_ OS CORE, Physical core,EcuC core,EcuC partition,OSApplication的关系

目录 关键词平台说明一、总体依赖关系二、相关概念三、在配置中的实现3.1 EcucPartition3.2 OsApplication3.3 Ecu core 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0c;C…

Centos7 防火墙iptables?

Centos7 防火墙iptables&#xff1f; 文章目录 Centos7 防火墙iptables&#xff1f;1. 介绍2. firewalld 和 iptables区别3. 区域管理概念区域管理有如下几种不同的初始化区域&#xff1a; 4.iptables的配置1.简述2.基本原理3.iptables传输数据包的过程4. iptables规则表和链5.…

C++初阶:STL容器list的使用与初版自实现

目录 1. list的接口与使用1.1 默认成员函数1.2 迭代器与容量相关成员函数1.3 存储数据操作相关成员函数1.4 其他list操作成员函数 2. list的自实现2.1 list的自实现功能2.2 list的结点结构2.3 list的迭代器2.3 list的结构2.4 list迭代器的运算符重载2.5 list的成员函数 3. cons…

python绘图matplotlib——使用记录2

本博文来自于网络收集&#xff0c;如有侵权请联系删除 三维图绘制 1 三维散点图2 三维柱状图三维曲面 1 三维散点图 import matplotlib.pyplot as plt import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig plt.figure() # ax fig.gca(projection"3d")…

javase day11笔记

第十一天课堂笔记 构造代码块 { } 给 所有对象 共性特点 进行初始化操作 创建对象时在堆区对象中存放实例变量,同时执行构造代码块 执行顺序:静态代码块—>非静态代码块—>构造方法 继承★★★ 将多个类中相同的实例变量和实例方法 , 单独存放到一个类中,成为父类…

【Linux】写个日志和再谈线程池

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;信号量和线程池 目录 &#x1f449;&#x1f3fb;日志代码Log.cppMain.cc &#x1f449;&#x1f3fb;线程池代码LockGuard.hpp(自定义互斥锁&#xff0c;进…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师&#xff08;进阶&#xff09;》是由“ i春秋学院联合网易安全部”出品&#xff0c;资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战&#xff0c;帮助学员纵向提升技能&#xff0c;横向拓宽视野&#xff0c;牢靠掌握Web安全工程师核心…

Python6:Socket编程初步学习笔记

Socket协议概要 创建socket的时候&#xff0c;需要一些选项来说明本次使用协议具体是什么&#xff0c;常用的两个&#xff1a; 由此产生的不同组合&#xff1a; 但目前TCP(IPV4)是主流&#xff0c;SOCK_STREAMAF_INET 创建和使用Socket socket模块中有socket类&#xff1a…

51单片机学习笔记——LED闪烁和流水灯

任务分析 首先要知道LED闪烁主要是怎么工作的&#xff0c;闪烁亮灭自然是一下为高一下为低&#xff0c;亮灭的频率则需要延时来进行控制。 上节已经知道了如何点亮那延时如何做呢首先先编写主框架 这样是否可以通过循环将LED灯一直循环闪烁。 以为while一直在循环所以其实是可…

向开发板上移植ip工具:交叉编译 ip工具

一. 简介 前面几篇文章学习了 CAN设备节点的创建&#xff0c;以及如何使能 CAN驱动。 本文学习向开发板上移植ip工具。 二. 向开发板上移植ip工具&#xff1a;交叉编译 ip工具 注意&#xff1a;在移植 ip 命令的时候必须先对根文件系统做个备份&#xff01;防止操作失误导…

力扣74---搜索二维矩阵

目录 题目描述&#xff1a; 思路&#xff1a; 代码&#xff1a; 题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 targ…

c#绘制图形

窗体工具控件 如果选纹理 ,需要在ImageList中选择图像(点击添加选择图片路径) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.…

【Redis教程0x03】详解Redis的基本数据类型

引言 根据【Redis教程0x02】中介绍的&#xff0c;Redis的数据类型可分为5种基本数据类型&#xff08;String、Hash、List、Set、Zset&#xff09;和4种高级数据类型&#xff08;BitMap、HyperLogLog、GEO、Stream&#xff09;。在本篇博客中&#xff0c;我们将详解这9种数据类…

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参…

Springboot做分组校验

目录 分组校验 Insert分组 Upload分组 测试接口 测试结果 添加测试 更新测试 顺序校验GroupSequence 自定义分组校验 自定义分组表单 CustomSequenceProvider 测试接口 测试结果 Type类型为A Type类型为B 总结&#xff1a; 前文提到了做自定义的校验注解&#xff…

牛客NC170 最长不含重复字符的子字符串【高频 中等 map、滑动窗口 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7 思路 用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况&#xff1a;“bacbca”这里的a…

初识kafka-数据存储篇1

目录 背景 1 kafka总体体系结构 2 疑问解答 2.1 高吞吐低延迟 2.2 实现分布式存储和数据读取 2.3 如何保证数据不丢失 背景 最近在和产品过项目审批的时候&#xff0c;深刻感受到业务方对系统的时时响应提出了更高的要求。目前手上大部分的业务都是基础定时任务去实现的&…

【yolo算法水果新鲜程度检测】

Yolo&#xff08;You Only Look Once&#xff09;系列算法是一类流行的一阶段实时目标检测模型&#xff0c;在水果检测领域有着广泛的应用。因其高效性和实时性而受到青睐&#xff0c;可用于识别和定位图像中不同种类的水果以及水果的新鲜度。 YOLOv3 已被用于水果商品的检测分…

家乡特色推荐系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

【Linux】线程互斥{线程间的互斥相关背景概念/锁的相关问题/锁的原理/可重入VS线程安全}

文章目录 0.计算机如何完成y a * b c &#xff1f;1.线程间的互斥相关背景概念2.pthread_mutex_t3.pthread_mutex_lock()4.time() or gettimeofday5.锁的相关问题6.锁的原理7.可重入VS线程安全8.完善后的代码 0.计算机如何完成y a * b c &#xff1f; 来源&#xff1a; 王道…