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. httpd.conf配置解析php

    PHPIniDir "D:/php-5.3.5" LoadModule php5_module "D:/php-5.3.5/php5apache2_2.dll" ...

  2. Div+Css的初步运用

    采用DIV+CSS模式的网站具有以下优势:1.表现和内容相分离 2.代码简洁,提高页面浏览速度 3.易于维护和改版 4.提高搜索引擎对网页的索引效率. 然后呢html文件中放置CSS有三种类型:内联. ...

  3. asp.net中常用的几种身份验证方式

    转载:http://www.cnblogs.com/dinglang/archive/2012/06/03/2532664.html   前言 在B/S系统开发中,经常需要使用"身份验证&q ...

  4. Android res资源文件夹的知识积累

    Android的开发框架耦合性还是比较低的,逻辑和布局被原生分开了.在Eclipse一般代码写在src文件夹下,资源等写在res文件夹下. drawable文件夹:该文件夹有很多变种,主要是为了适配A ...

  5. Android系统中的dp和px的转换

    android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...

  6. 【Excel VBA】金额大写转换

    =IF(ROUND(A1,2)<0,"金额为负无效",IF(ROUND(A1,2)=0,"零元",IF(ROUND(A1,2)<1,"&q ...

  7. 浅析foreach原理

    在日常开发工作中,我们发现很多对象都能通过foreach来遍历,比如HashTable.Dictionary.数组等数据类型.那为何这些对象能通过foreach来遍历呢?如果写一个普通的Person类 ...

  8. ###STL学习--适配器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-24 #@email: forgerui@gmail.com STL中的适配器. ###stl学习 |--迭代 ...

  9. 区分.net、c#、asp.net三者间的关系

    1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type system).   ②包含.net公共语言运行库( ...

  10. OC1_类与对象

    // // main.m // OC1_类与对象 // // Created by zhangxueming on 15/6/9. // Copyright (c) 2015年 zhangxuemin ...