Solution -「ExaWizards 2019 C」Snuke and Wizards
\(\mathcal{Description}\)
Link.
给定一个长度为 \(n\) 的字符串 \(s\),每个字符上初始有一张卡片。\(q\) 次操作,每次指定 \(s\) 中字符为 \(c\) 的所有位置上的所有卡片向左或向右移动一位,移出字符串则消失。求操作完成后剩下的卡片数量。
\(n\le10^5\)。
\(\mathcal{Solution}\)
脑补了很多优雅的做法,卡了好久才发现这道题其实很蠢 qwq……
显然,消失的卡片是原字符串上卡片的一段前缀和一段后缀,直接二分边界检查即可。
复杂度 \(\mathcal O(n\log n)\)。
哎呀我何必这么水题解呢。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
const int MAXN = 2e5;
int n, q;
char s[MAXN + 5], let[MAXN + 5], way[MAXN + 5];
inline char rlet () {
char ret = getchar ();
for ( ; ret < 'A' || 'Z' < ret; ret = getchar () );
return ret;
}
inline int check ( int x ) {
for ( int i = 1; i <= q && 1 <= x && x <= n; ++ i ) {
if ( let[i] == s[x] ) {
x += way[i] == 'L' ? -1 : 1;
}
}
return x < 1 ? -1 : x > n;
}
int main () {
scanf ( "%d %d %s", &n, &q, s + 1 );
for ( int i = 1; i <= q; ++ i ) let[i] = rlet (), way[i] = rlet ();
int l = 0, r = n, ans = n;
while ( l < r ) {
int mid = l + r + 1 >> 1;
if ( !~check ( mid ) ) l = mid;
else r = mid - 1;
}
ans -= l ++, r = n + 1;
while ( l < r ) {
int mid = l + r >> 1;
if ( check ( mid ) == 1 ) r = mid;
else l = mid + 1;
}
ans -= n - l + 1;
printf ( "%d\n", ans );
return 0;
}
\(\mathcal{Details}\)
一个思路一定要连贯地想到困境再舍弃,不同思路来回跳跃太浪费时间啦!
Solution -「ExaWizards 2019 C」Snuke and Wizards的更多相关文章
- Solution -「Tenka1 2019 D」Three Colors
\(\mathcal{Description}\) Link. 给定 \(\{a_n\}\),把每个元素划分入可重集 \(R,G,B\) 中的恰好一个,求满足 \(\sum R,\sum G, ...
- 「JOISC 2019 Day3」穿越时空 Bitaro
「JOISC 2019 Day3」穿越时空 Bitaro 题解: 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. 问题变成二维平面上 ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3032. 「JOISC 2019 Day1」馕
LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- 【LOJ】#3031. 「JOISC 2019 Day1」聚会
LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
随机推荐
- C/C++避免头文件重复包含的方法
C/C++避免头文件重复包含的方法 1. #ifndef 2. #pragma once 3. 混合使用 在实际的编程过程中,因为会使用多个文件,所以在文件中不可避免的要引入一些头文件,这样就可能会出 ...
- 基于 Keras 实现图像风格转移
Style Transfer 这个方向火起来是从2015年Gatys发表的Paper A Neural Algorithm of Artistic Style(神经风格迁移) , 这里就简单提一下论 ...
- Android中添加监听回调接口的方法
在Android中,我们经常会添加一些监听回调的接口供别的类来回调,比如自定义一个PopupWindow,需要让new这个PopupWindow的Activity来监听PopupWindow中的一些组 ...
- NPOI Excel导入Invalid header signature
excel是从网页下载或者其他第三方软件导出的解决方法:使用excel打开,另存为2003版的excel,再导入就好了或者保存为 xlsx
- ClassCastException: java.util.Date cannot be cast to java.sql.Date
解决办法 /** * 单个方法,作用,根据输入的day:yyyy-mm-dd格式的字符日期,将数据库中的该天所有数据更新为0 * 0表示假期 * @param day * @throws SQLExc ...
- JDK原子操作类
在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型.原子更新数组.原子更新引用和原子更新属性(字段).Atomic包里的类基本都是使用Unsafe实现的包装类. ...
- Qt之进入和出去和关闭事件
widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QEvent> class Wi ...
- Selenium&PhantomJS 完成爬取网络代理
Selenium模块是一套完整的Web应用程序测试系统,它包含了测试的录制(SeleniumIDE).编写及运行(Selenium Remote Control)和测试的并行处理(Selenimu G ...
- a 标签一些特殊用法
发邮件 <a href="mailto:youemail@mail.com?subject=邮件标题&body=邮件内容">告诉我们</a> 打电话 ...
- 虚拟化技术kvm,xen,vmware比较
目前市面上常用的虚拟机技术主要有KVM.xen.vmware. KVM是指基于Linux内核(Kernel-based)的虚拟机(Virtual Machine).KVM最大的好处就在于它是与Linu ...