[POI2014]Criminals
题目大意:
给你一个长度为$n(n\le10^6)$的颜色序列,其中每个颜色互不相同。两个人$A$和$B$分别从某个点出发从左往右、从右往左任意地选择颜色,然后在中间的某一点相遇。分别给出两人所选择的颜色序列,求有哪些点可能是相遇点。
思路:
$O(n)$线性扫出对于每个点$i$,颜色序列$A$在$i$及$i$前结束时,$A$左端点最右的位置$l_i$,颜色序列$B$在$i$及$i$后结束时,$B$右端点最右的位置$r_i$。
枚举每个点作为相遇点,判断区间$[1,l_i)$和$(r_i,n]$有没有相同颜色即可。因为$l_i$和$r_i$都是单调不降,因此复杂度还是$O(n)$的。
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e6+;
int c[N],s1[N],s2[N],pos1[N],pos2[N],f[N],l[N],r[N],ans[N];
int main() {
const int n=getint(),m=getint();
for(register int i=;i<=n;i++) c[i]=getint();
s1[]=getint(),s2[]=getint();
for(register int i=;i<=s1[];i++) f[pos1[s1[i]=getint()]=i]=;
for(register int i=;i<=n;i++) {
if(pos1[c[i]]) f[pos1[c[i]]]=pos1[c[i]]==?i:f[pos1[c[i]]-];
l[i]=f[s1[]];
}
for(register int i=;i<=s2[];i++) f[pos2[s2[i]=getint()]=i]=n+;
for(register int i=n;i>=;i--) {
if(pos2[c[i]]) f[pos2[c[i]]]=pos2[c[i]]==?i:f[pos2[c[i]]-];
r[i]=f[s2[]];
}
for(register int i=;i<=m;i++) pos1[i]=pos2[i]=;
for(register int i=;i<=n;i++) pos2[c[i]]++;
for(register int i=,tmp=;i<=n;i++) {
for(register int j=l[i-];j<l[i];j++) {
if(!pos1[c[j]]++&&pos2[c[j]]) tmp++;
}
for(register int j=r[i];j>r[i-];j--) {
if(!--pos2[c[j]]&&pos1[c[j]]) tmp--;
}
if(c[i]==s1[s1[]]&&tmp) ans[++ans[]]=i;
}
printf("%d\n",ans[]);
for(register int i=;i<=ans[];i++) {
printf("%d%c",ans[i]," \n"[i==ans[]]);
}
return ;
}
[POI2014]Criminals的更多相关文章
- BZOJ3828 : [Poi2014]Criminals
对于每个位置求出L[i]表示左边最大的j,满足从j开始到i-1中存在第一个子序列 R[i]表示右边最小的j,满足从j开始到i-1中存在第二个子序列 然后枚举颜色是相遇点的位置,如果L[i]左边.R[i ...
- POI2014题解
POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- Codeforces Round #356 (Div. 2)B. Bear and Finding Criminals(水题)
B. Bear and Finding Criminals time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- 【BZOJ】【3522】【POI2014】Hotel
暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...
- 【BZOJ】【3831】【POI2014】Little Bird
DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...
随机推荐
- [0] OpenCV_Notes - 琐碎
CV_8UC1,CV_8UC2,CV_8UC3等意思 一般的图像文件格式使用的是 Unsigned 8bits,CvMat矩阵对应的参数类型就是CV_8UC1,CV_8UC2,CV_8UC3.最后的C ...
- Python 的音乐库
前言 其实处理这个用 Matlab 最方便,之前把 guitar-synthesizer 从 Matlab 移植到 Python,过程中更是体会到了这一点. 不过 Matlab 安装包又大,启动又慢, ...
- Android详细目录结构
Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...
- SVN客户端使用手册
使用svn进行源代码版本控制,代码管理利器. 优点: 使用方便,与文件管理器集成.速度快,稳定. 实现代码比较,比如对历史和当前代码进行比较. 解决多人同时编写代码时代码重复修改困难. 安装: 下载网 ...
- CodeForces A. Many Equal Substrings
http://codeforces.com/contest/1029/problem/A You are given a string tt consisting of nn lowercase La ...
- 二、vue响应式对象
Object.defineProperty Object.defineProperty 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,先来看一下它的语法: Obj ...
- zoj 1002 Fire Net (二分匹配)
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...
- 阿里云服务器ubuntu安装java运行环境
服务器 阿里云服务器ubuntu安装java运行环境 转:http://www.codingyun.com/article/45.html 今天来给大家介绍一下在阿里云ubuntu服务器下安装java ...
- 栅栏涂漆(color)
栅栏涂漆测评 题目描述 zed 最近总是受到 Farmer 的困扰,因此他在自家的门前插了一排栅栏以防农气的入侵.栅栏由 N 个竖条栅栏横向组成,每个竖条栅栏宽度为 1.过了一段时间,zed 觉得栅栏 ...
- UVALIVE 3972 March of the Penguins
最大流建图比较容易第一次Dicnc抄了下别人的版 存一下以后方便查 #include <map> #include <set> #include <list> #i ...