LOJ #2734 Luogu P3615 [JOI2016春季合宿]Toilets (结论、贪心)
题目链接
(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 (结论、贪心)相关推荐
- LOJ #2731 [JOI2016春季合宿]Solitaire (DP、组合计数)
题目链接 https://loj.ac/problem/2731 题解 首先一个很自然的思路是,设\(dp[i][j]\)表示选了前\(i\)列,第\(2\)行第\(i\)列的格子是第\(j\)个被填 ...
- LOJ #2733 [JOI2016春季合宿]Sandwiches (DP)
题目链接 https://loj.ac/problem/2733 题解 神仙题-- 首先可以观察到一个结论: 目标块的两块小三明治一定分别是最后和倒数第二个被吃的. 由此我们可以考虑这两块谁先被吃.这 ...
- JOI-2016/17 春季合宿 切题记
17年的合宿好难啊...感觉是我做过的最难的一套题(没有之一)了...但是可能也是价值最高的? Day1: T1 Cultivation:给你一个H*W的网格,有N<=300棵仙人掌.每一年可以 ...
- JOI2017 春季合宿:Railway Trip
自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...
- 【JOI2017春季合宿】Port Facility
http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连 ...
- BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...
- BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...
- [JOI2012春季合宿]Rotate (链表)
题意 题解 又是一道神仙题-- 显然的做法是大力splay,时间复杂度\(O((N+Q)N\log N)\), 可以卡掉. 正解: 使用十字链表维护矩阵,在周围增加第\(0\)行/列和第\((n+1) ...
- [JOI2012春季合宿]Constellation (凸包)
题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...
最新文章
- Error: Aesthetics must be either length 1 or the same as the data (5): fill
- Linux 查看交换区内容,Unix: Unix/Linux/Win的虚拟交换区信息的查看
- 成功解决在excel表中通过数学函数转换后,接着去掉公式转为不再随着变化的数值
- jcDate时间选取jQuery插件
- 24行代码AC_蓝桥杯2019省赛 试题 D: 数的分解
- sqlserver查询当月的每一天_SQL生成一年每一天的时间列表的几种方法
- java1.8.0,jdk1.8.0版本
- java_自由块(静态块和非静态块)
- 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)
- QQ所有文件和目录详细分析
- 多媒体SCM格式介绍
- 家里蹲大学数学杂志官方网站
- 自动激活win7系统的bat文件
- 程序“[4176] char.exe: 本机”已退出,返回值为 0 (0x0)
- 基于pyqt5 构建弹窗进度条,在大型计算中实时显示进度
- 类的访问权限-public、private、protected
- 正在连接到192.168.1.118 不能打开到主机的连接, 在端口 1521: 连接失败
- 软负载均衡和硬负载均衡
- 使用snap安装mosquitto并且进行初步配置
- java 读取doc文件_如何在java中读取Doc或Docx文件?