题目链接

(loj) https://loj.ac/problem/2734
(luogu) https://www.luogu.org/problem/P3615

题解

嗯,考场上肝了\(3h\)然而最后发现一个智障地方没想到……我果然还是菜的真实啊
首先队列合法(能在\(N\)分钟内解决)当且仅当: 每一个长度为偶数的后缀女生数量都不少于一半(一个等价的表述是,如果把男人看成\(1\)女人看成\(-1\)那么任何一个后缀和不大于\(1\), 但是这里由于是对女生操作所以只考虑女生会好很多)。证明只能根据题意一步步推,这里略去。
然后考虑\(O(n)\)做法: 若总共男人数严格多于女人数则无解,否则从后往前扫,若某个后缀女人数量少于一半了就把最近的女人移过来,显然最优。
因此,设从后往前第\(i\)个女人位于从后往前第\(i\)个位置,则答案为\(\max(0,\max_i (b_i-2i))\).
现在字符串长度很大,那么发现对于每一个重复的子串,若其中女人数量多于一半则只需考虑从后往前的第一次重复,否则只需考虑最后一次,于是直接做即可。
时间复杂度\(O(\sum |s_i|)\).

代码

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
using namespace std;const int N = 2e5;
struct Element
{vector<char> s;int cnt0,cnt1; llong t;
} a[N+3];
llong sum[N+3],sum1[N+3];
char str[N+3];
llong n; int m;int main()
{scanf("%lld",&n);scanf("%d",&m);llong tot = 0ll;for(int i=1; i<=m; i++){scanf("%s%lld",str+1,&a[i].t); int len = strlen(str+1);for(int j=1; j<=len; j++){a[i].s.push_back(str[j]);if(str[j]=='F') {tot-=a[i].t; a[i].cnt1++;}else {tot+=a[i].t; a[i].cnt0++;}}}for(int i=m; i>=1; i--){sum[i] = sum[i+1]+a[i].s.size()*a[i].t;sum1[i] = sum1[i+1]+a[i].cnt1*a[i].t;}if(tot>0) {puts("-1"); return 0;}llong ans = 0ll;for(int i=m; i>=1; i--){llong cur1 = sum1[i+1],cur = sum[i+1];if(2*a[i].cnt1<a[i].s.size()){cur1 += a[i].cnt1*(a[i].t-1ll);cur += a[i].s.size()*(a[i].t-1ll);}for(int j=a[i].s.size()-1; j>=0; j--){cur++;if(a[i].s[j]=='F') {cur1++;}
//          printf("cur=%lld cur1=%lld\n",cur,cur1);ans = max(ans,cur-(cur1<<1)-1);}}printf("%lld\n",ans);return 0;
}

LOJ #2734 Luogu P3615 [JOI2016春季合宿]Toilets (结论、贪心)相关推荐

  1. LOJ #2731 [JOI2016春季合宿]Solitaire (DP、组合计数)

    题目链接 https://loj.ac/problem/2731 题解 首先一个很自然的思路是,设\(dp[i][j]\)表示选了前\(i\)列,第\(2\)行第\(i\)列的格子是第\(j\)个被填 ...

  2. LOJ #2733 [JOI2016春季合宿]Sandwiches (DP)

    题目链接 https://loj.ac/problem/2733 题解 神仙题-- 首先可以观察到一个结论: 目标块的两块小三明治一定分别是最后和倒数第二个被吃的. 由此我们可以考虑这两块谁先被吃.这 ...

  3. JOI-2016/17 春季合宿 切题记

    17年的合宿好难啊...感觉是我做过的最难的一套题(没有之一)了...但是可能也是价值最高的? Day1: T1 Cultivation:给你一个H*W的网格,有N<=300棵仙人掌.每一年可以 ...

  4. JOI2017 春季合宿:Railway Trip

    自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...

  5. 【JOI2017春季合宿】Port Facility

    http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连 ...

  6. BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...

  7. BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...

  8. [JOI2012春季合宿]Rotate (链表)

    题意 题解 又是一道神仙题-- 显然的做法是大力splay,时间复杂度\(O((N+Q)N\log N)\), 可以卡掉. 正解: 使用十字链表维护矩阵,在周围增加第\(0\)行/列和第\((n+1) ...

  9. [JOI2012春季合宿]Constellation (凸包)

    题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...

最新文章

  1. Error: Aesthetics must be either length 1 or the same as the data (5): fill
  2. Linux 查看交换区内容,Unix: Unix/Linux/Win的虚拟交换区信息的查看
  3. 成功解决在excel表中通过数学函数转换后,接着去掉公式转为不再随着变化的数值
  4. jcDate时间选取jQuery插件
  5. 24行代码AC_蓝桥杯2019省赛 试题 D: 数的分解
  6. sqlserver查询当月的每一天_SQL生成一年每一天的时间列表的几种方法
  7. java1.8.0,jdk1.8.0版本
  8. java_自由块(静态块和非静态块)
  9. 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)
  10. QQ所有文件和目录详细分析
  11. 多媒体SCM格式介绍
  12. 家里蹲大学数学杂志官方网站
  13. 自动激活win7系统的bat文件
  14. 程序“[4176] char.exe: 本机”已退出,返回值为 0 (0x0)
  15. 基于pyqt5 构建弹窗进度条,在大型计算中实时显示进度
  16. 类的访问权限-public、private、protected
  17. 正在连接到192.168.1.118 不能打开到主机的连接, 在端口 1521: 连接失败
  18. 软负载均衡和硬负载均衡
  19. 使用snap安装mosquitto并且进行初步配置
  20. java 读取doc文件_如何在java中读取Doc或Docx文件?

热门文章

  1. 【实战】感恩教师节小程序制作
  2. 系统间通信1:阻塞与非阻塞式通信B
  3. FPN(Feature Pyramid Network)多尺度目标检测方案
  4. 将DOS批处理文件转换为Shell脚本
  5. 八大编程知名编程语言或系统的发展简史
  6. wireshark抓包详解
  7. dosbox中的bebug指令
  8. Abstract class虚拟类
  9. layui中onchange失效以及form动态渲染失效的问题
  10. replugin源码解析之replugin-host-gradle(宿主的gradle插件)