题面

现有两个厕所,一个女士专用,一个通用,给出\(2*n\)个排成一列的人的性别

每人如厕需要一分钟,假如女厕是空的,女生中最靠前的可以直接进入。

需要通过调换顺序使得所有人都上完厕所最后的时间为n分钟

要求最小化队伍中更改位置的最远距离

题目范围戳这里

题解

考虑不合法的情况:

一定是当前状态下还在等待的男生比女生多两个以上(多一个时,肯定通用厕所是空的)

那么

设男生贡献为1,女生为-1,所以我们要保证任何时候 序列总和<2,即: 任意后缀和 < 2


然后考虑如何贪心???

在贪心之前,我们先找出几个可贪心的性质:

对于第一个女生来说,她向后挪了一个位置,则一定有一个男生插队在其之前,挪了两个就是两个男生插队

而我们可以发现

对于同性的人来说,相对顺序是不会变的(即使有男生插队,同性别个体相同,所以相对顺序还是不变)

所以我们可以得到一个妙妙的结论:

除去开头的男生,无论哪个位置多少个男生移到最前列,所产生的贡献一定是男生的数量

我们略加思考就可以想到:

在排除男生总数多于女生之后,

对于一个有冲突的男生(即加上此人男生正好比女生多2),我们肯定需要改变他的位置

而他前移过程中超过的每个女生都会产生1的贡献,我们只要求最小化最大的女生移动距离

所以我们将当前这个有冲突的男生移到最前面一定是最优的,因为将其移到最前端之后他不可能再产生贡献

所以思路就很清晰了,直接统计有多少个需要挪动的男生就好

关于如何统计:

  • 对于每个给定的字符串Si 分别统计总和\(sum_i\)
  • 记录 Si 求后缀时产生的最大值\(maxx_i\)
  • 当这个字符串Si 接入整体时,它的贡献就是 :

    (k[i]-1)*sum[i]+maxx[i]
  • 因为贡献不会是负数(男生不能向后挪)所以当 sum[i]<2 时,贡献为: maxx[i]

代码

#include<bits/stdc++.h>
using namespace std;
#define re register
#define in inline
#define ll long long
#define get getchar()
in ll read()
{
ll t=0,x=1;char ch=get;
while((ch<'0'||ch>'9')&&ch!='-')ch=get;
if(ch=='-')x=-1,ch=get;
while(ch<='9'&&ch>='0')t=t*10+ch-'0',ch=get;
return x*t;
}
const int _=2e5+5;
char s[_];
int sum[_],maxx[_];
ll k[_],tot,ans=1;
int main()
{
ll n=read(),m=read();
for(re int i=1;i<=m;i++)
{
scanf("%s",s+1);
k[i]=read();
int len=strlen(s+1);
for(re int j=len;j>=1;j--)
{
int flag=(s[j]=='M'?1:-1);
sum[i]+=flag; //统计总和
maxx[i]=max(maxx[i],sum[i]); //统计当前字符串的后缀最大值
}
}
for(re int i=m;i>=1;i--)
{
if(sum[i]>0) //说明当前这节中男生多了
ans=max(ans,tot+1LL*sum[i]*(k[i]-1)+maxx[i]); //本段中要挪动的男生数量
else //尽管男生总体不多,但是可能存在与下一段接洽的地方男生多了(因为每段要重复多次)
ans=max(ans,tot+maxx[i]);
tot=tot+1LL*sum[i]*k[i];
}
if(tot>1) cout<<"-1"<<endl;
else cout<<ans-1<<endl;
return 0;
}

LuoguP3615 如厕计划的更多相关文章

  1. P3615 如厕计划

    $ \color{#0066ff}{ 题目描述 }$ 竞赛比完之后,水箱里充满水的选手们鱼贯而出.凡华中学的厕所规划的很糟,只有两个厕位,于是厕所门前排起了长长的队伍. 厕所有两个,一个是女生专用厕所 ...

  2. loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划

    loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...

  3. fjwc2019 D3T2 送分题

    #185. 「2019冬令营提高组」送分题 这是原题..... P3615 如厕计划 手推一推你发现,显然男性不能多于女性. 然后你或许可以发现一个神奇的性质. 对于每个序列,我们记$M$为$1$,$ ...

  4. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  5. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  6. FOI冬令营 Day 3

    目录 T1.签到题(sort) 传送门 Code T2.送分题(queue) 传送门 Code T3.简单题(game) 传送门 Code 咕咕咕 T1.签到题(sort) 传送门 原题:LOJ 27 ...

  7. 【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划

    发个通知,过段时间学习计划相关的东西就出来了,上次写了篇指引文章后有些好奇心颇重的人跟我说:“发现最近群知识库和技能库更新的频率有点大,这是要放大招的节奏啊!” 很多想学习却不知道如何规划的人想要一个 ...

  8. SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)

    前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...

  9. ORACLE从共享池删除指定SQL的执行计划

    Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...

随机推荐

  1. 聊聊经典数据结构HashMap,逐行分析每一个关键点

    本文基于JDK-8u261源码分析 本文原创首发于 奇客时间(qiketime) 1 简介 HashMap是一个使用非常频繁的键值对形式的工具类,其使用起来十分方便.但是需要注意的是,HashMap不 ...

  2. mysql-14-transaction

    #TCL /* 事务控制语言 事务:一个或一组sql语句组成一个执行单元,每条sql语句相互依赖 这个执行单元要么全部执行.要么全部失败后回滚 案例:转账 事务的acid属性 1.原子性:事务时一个不 ...

  3. makefile实验一 make的基本原则、伪目标、以及不使用.PHONY确实现和伪目标一样功能的一种方法

    target: echo "hello_Makefile" .PHONY: clean clean: echo "clean Done .2019" 使用伪目标 ...

  4. 使用模拟退火算法优化 Hash 函数

    背景 现有个处理股票行情消息的系统,其架构如下: 由于数据量巨大,系统中启动了 15 个线程来消费行情消息.消息分配的策略较为简单:对 symbol 的 hashCode 取模,将消息分配给其中一个线 ...

  5. 使用SSM框架实现Sql数据导出成Excel表

    SSM框架实现SQL数据导出Excel 思路 首先在前端页面中添加一个导出功能的button,然后与后端controller进行交互. 接着在相应的controller中编写导出功能方法. 方法体: ...

  6. CISCO交换机STP实验(生成树协议)

    目录 一.前言:生成树协议(STP) 二.CISCO交换机STP命令汇总 三.运用STP搭建简单拓扑 四.实战:STP综合实验 五.结语 一.前言:生成树协议(STP) 计算机网络中,我们为了减少网络 ...

  7. 050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句

    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句 本文知识点:continue语句 continue语句 continue ...

  8. requests基本用法

    首先,确认一下:已安装 requests 从一些简单的示例开始吧. 发送请求 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> impo ...

  9. 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布

    简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 ...

  10. ansible-handlers变更执行操作

    1. ansible-handlers在变更执行操作  1) 编写playbook的handlers的配置文件 1 [root@test-1 bin]# vim /ansible/nginx/bin/ ...