1314: River过河

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 26  Solved: 10
[Submit][Status][Discuss]

Description

ZY
带N个小Kid过河,小KID分成两种:高一年级,高二年级,由于存在代沟问题,如果同一条船上高一年级生和高二年级生数量之差超过K,就会发生不和谐的
事件.当然如果一条船上全是同一年级的,就绝对不会发生争执.现在ZY按小KID队列的顺序依次安排上船,并且不能让他们在过河时发生争执.对于当前等待
上船的小KID来说,要么让他上船,要么将停在渡口的船开走,再让他上另一条船,同一条船上的人不过超过M人.为了让所有的小KID过河,在知悉小KID
队列的情况下,最少需要多少条船.

Input

第一行给出N,M,K.含义如上所述
下行N行用来描述小KID的队列,每行一个字符”A”或者”L”

Output

最少需要多少条船

Sample Input

5 4 1
A
L
L
L
A

Sample Output

2

HINT

前三个人一条船,后两个人一条船
数据范围
30% 数据中1<=N<=1000
100%数据中1<=N<=250000,1<=M,K<=N

  这道题过的人这么少不太正常啊。

  容易看出,如果对输入数列换成+1/-1,然后做前缀和,当前dp[i]可以由j-i>=m and abs(a[j]-a[i])<=k 一个矩形内区域的dp值转移出来,首先kdtree肯定没有问题,看有无简单点的做法,思考整体二分,发现不太好处理,注意上述的矩形区域有着固定的宽,而且x坐标单调递增,于是很容易想到对于每一个a[i]维护优先队列了。

  用deque<int>要mle,原因是deque封装了大量维护下标访问的量,而改成list<int>内存要好很多。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<deque>
#include<list>
using namespace std;
#define MAXN 251000
#define lch (now<<1)
#define rch (now<<1^1)
#define smid ((l+r)>>1)
#define MAXT MAXN*4
#define INF 0x3f3f3f3f
int a[MAXN];
int dp[MAXN];
list<int> lst[MAXN];
int sgt[MAXT];
void Modify_sgt(int now,int l,int r,int pos,int v)
{
if (l==r)
{
sgt[now]=v;
return ;
}
if (pos<=smid)
Modify_sgt(lch,l,smid,pos,v);
else
Modify_sgt(rch,smid+,r,pos,v);
sgt[now]=min(sgt[lch],sgt[rch]);
}
int Query_sgt(int now,int l,int r,int x,int y)
{
if (l==x && r==y)
return sgt[now];
if (y<=smid)
return Query_sgt(lch,l,smid,x,y);
else if (smid<x)
return Query_sgt(rch,smid+,r,x,y);
else
return min(Query_sgt(lch,l,smid,x,smid),Query_sgt(rch,smid+,r,smid+,y));
}
list<int> que; int main()
{
freopen("input.txt","r",stdin);
int n,m,t,x,y,z;
scanf("%d%d%d\n",&n,&m,&t);
char ch;
int level=;
int mxvvv=;
memset(sgt,INF,sizeof(sgt));
a[]=;
for (int i=;i<=n;i++)
{
scanf("%c\n",&ch);
if (ch=='A')
a[i]=;
else
a[i]=-;
}
for (int i=;i<=n;i++)
a[i]+=a[i-];
for (int i=;i<=n;i++)
level=min(a[i],level);
for (int i=;i<=n;i++)
mxvvv=max(a[i],mxvvv);
level=-level;
mxvvv+=level;
for (int i=;i<=n;i++)
a[i]+=level;
dp[]=;
lst[a[]].push_back();
Modify_sgt(,,mxvvv,a[],dp[lst[a[]].front()]);
que.push_back();
for (int i=;i<=n;i++)
{
dp[i]=Query_sgt(,,mxvvv,max(,a[i]-t),min(mxvvv,a[i]+t))+;
if (que.size() && a[que.front()]-a[que.front()-]==a[i]-a[i-])
dp[i]=min(dp[i],dp[que.front()-]+);
while (lst[a[i]].size() && dp[lst[a[i]].back()]>=dp[i])
lst[a[i]].pop_back();
lst[a[i]].push_back(i);
Modify_sgt(,,mxvvv,a[i],dp[lst[a[i]].front()]);
if (i>=m)
{
if (lst[a[i-m]].size() && lst[a[i-m]].front()==i-m)
{
lst[a[i-m]].pop_front();
if (lst[a[i-m]].size())
Modify_sgt(,,mxvvv,a[i-m],dp[lst[a[i-m]].front()]);
else
Modify_sgt(,,mxvvv,a[i-m],INF);
}
}
if (i== || a[i]-a[i-]==a[i+]-a[i])
{
while (!que.empty() && dp[que.back()-]>=dp[i])
que.pop_back();
que.push_back(i+);
}else
{
while (!que.empty())
que.pop_back();
que.push_back(i+);
}
if (i-que.front()+>=m)
que.pop_front();
}
printf("%d\n",dp[n]);
}

bzoj 1314: River过河 优先队列的更多相关文章

  1. bzoj 1314: River过河 树套树+单调队列

    Description ZY带N个小Kid过河,小KID分成两种:高一年级,高二年级,由于存在代沟问题,如果同一条船上高一年级生和高二年级生数量之差超过K,就会发生不和谐的事件.当然如果一条船上全是同 ...

  2. POJ1700:Crossing River(过河问题)

    POJ1700 题目链接:http://poj.org/problem?id=1700 Time Limit:1000MS     Memory Limit:10000KB     64bit IO ...

  3. poj 1700 Crossing River 过河问题。贪心

    Crossing River Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9887   Accepted: 3737 De ...

  4. BZOJ 1216: [HNOI2003]操作系统( 优先队列 )

    按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. BZOJ 1617: [Usaco2008 Mar]River Crossing渡河问题( dp )

    dp[ i ] = max( dp[ j ] + sum( M_1 ~ M_( i - j ) ) + M , sum( M_1 ~ M_i ) ) ( 1 <= j < i )  表示运 ...

  7. BZOJ 1617: [Usaco2008 Mar]River Crossing渡河问题

    题目 1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer ...

  8. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  9. Crossing River POJ过河问题

    A group of N people wishes to go across a river with only one boat, which can at most carry two pers ...

随机推荐

  1. 210 - Concurrency Simulator(WF1991, deque, 模拟)

    题目有点长,理解题花了不少时间 粘下别人的翻译~ 你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行.每个程序包含不超过25条语句,格式一共有5种: var=constant(赋值): pri ...

  2. EL表达式简单应用

    <%@page import="java.util.HashMap"%> <%@page import="java.util.List"%&g ...

  3. Spark1.2新特性概述

    http://mp.weixin.qq.com/s?__biz=MjM5NTc2MTg3Mw==&mid=201641685&idx=1&sn=1b75be3d774bb3f2 ...

  4. 【JavaScript权威指南(第五版)】笔记之第一部分 核心javascript (第1章~第12章)

    第一章 javascript概述 ①.javascript是一种松散类型语言;也是一种解释型语言;         第二章 词法结构 ①.大小写敏感         第三章 数据类型和值 ①.isFi ...

  5. 一个Notification 进度条插件(android,NJS实现,直接就可使用)

    参考文章:http://ask.dcloud.net.cn/article/503 源码地址下载 如题,分享一个Notification 进度条插件(android,用js调用原生api实现,直接就可 ...

  6. win2008远程桌面卡顿和上传慢的解决方法

    ibm服务器安装win2008server系统,发现远程桌面登陆特别卡,上传也慢的要死.下载没问题,这样初步判断网络没有问题. 打开注册表(regedit)找到: (1)打开HKEY_LOCAL_MA ...

  7. ubuntu16.04无法连接无线的问题解决方式以及QQ的安装

    0x01 首先我是安装了win10与ubuntu16.04的双系统,不过遇到的问题有启动项与无线连接的问题,今天说一下联网的问题. 连接宽带是正常的,只需要操作sudo pppoeconf 这条命令即 ...

  8. Basic MSI silent install

    Articles and post about silent install for Basic MSI, InstallScript, InstallScript MSI: Silent-mode ...

  9. OpenJudge/Poj 1844 Sum

    1.链接地址: http://bailian.openjudge.cn/practice/1844 http://poj.org/problem?id=1844 2.题目: Sum Time Limi ...

  10. linux svn authorization failed错误

    authorization failed错误主要是conf/auth文件配置错误,可以参考如下配置: [aliases] # joe = /C=XZ/ST=Dessert/L=Snake City/O ...