bzoj 1314: River过河 优先队列
1314: River过河
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 26 Solved: 10
[Submit][Status][Discuss]
Description
带N个小Kid过河,小KID分成两种:高一年级,高二年级,由于存在代沟问题,如果同一条船上高一年级生和高二年级生数量之差超过K,就会发生不和谐的
事件.当然如果一条船上全是同一年级的,就绝对不会发生争执.现在ZY按小KID队列的顺序依次安排上船,并且不能让他们在过河时发生争执.对于当前等待
上船的小KID来说,要么让他上船,要么将停在渡口的船开走,再让他上另一条船,同一条船上的人不过超过M人.为了让所有的小KID过河,在知悉小KID
队列的情况下,最少需要多少条船.
Input
下行N行用来描述小KID的队列,每行一个字符”A”或者”L”
Output
Sample Input
A
L
L
L
A
Sample Output
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过河 优先队列的更多相关文章
- bzoj 1314: River过河 树套树+单调队列
Description ZY带N个小Kid过河,小KID分成两种:高一年级,高二年级,由于存在代沟问题,如果同一条船上高一年级生和高二年级生数量之差超过K,就会发生不和谐的事件.当然如果一条船上全是同 ...
- POJ1700:Crossing River(过河问题)
POJ1700 题目链接:http://poj.org/problem?id=1700 Time Limit:1000MS Memory Limit:10000KB 64bit IO ...
- poj 1700 Crossing River 过河问题。贪心
Crossing River Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9887 Accepted: 3737 De ...
- BZOJ 1216: [HNOI2003]操作系统( 优先队列 )
按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 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 ) 表示运 ...
- BZOJ 1617: [Usaco2008 Mar]River Crossing渡河问题
题目 1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec Memory Limit: 64 MB Description Farmer ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- 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 ...
随机推荐
- PHP 有关上传图片时返回HTTP 500错误
1. 检查PHP GD 扩展库是否开启或者安装 在Ubuntu server中,在php -m 之后,未看到gd扩展,所以需要安装gd,然后重启apache2 sudo apt-get install ...
- HTTP层 —— 请求
1.访问请求实例 要通过依赖注入获取当前 HTTP 请求实例,需要在控制器的构造函数或方法中对 Illuminate\Http\Request 类进行类型提示,这样当前请求实例会被服务容器自动注入: ...
- JAXB - Unmarshalling
A simple approach for unmarshalling an XML document consists of the creation of a JAXB context and t ...
- C# 3.0 其他XML技术
使用XmlReader枚举结点: <?xml version="1.0" encoding="utf-8" standalone="yes&qu ...
- linux---基本查找命令
基本查找命令 一.文件查找命令:find 最大特点:功能强大,可以使用文件的各种属性作为查找条件来查找文件 文件属性:文件权限.文件所有者.文件大小.修改时间.文件类型 语法:find[起始查找目录] ...
- Linq 中的TakeWhile 和 SkipWhile
这两个概念容易搞混 理解了一番后 在这里写下便于记忆 SkipWhile 可以理解为如果条件满足 就一直跳过 知道不满足后 就取剩下的所有元素(后面的不会再判断) TakeWhile 可以理解为 ...
- VIM 拼写/spell check
VIM 拼写检查/spell check 一.Hunspell科普 Hunspell 作为一个拼写检查的工具,已经用在了许多开源的以及商业软件中.包括Google Chrome, Libreoffic ...
- 安装Cygwin
如果你现在正在学习C语言,而你又不希望使用微软提供的任何C语言的任何编译器,那么你应该考虑一下GCC.GCC是运行于类UNIX系统下的编译器工具集,这又引出了另一个让人头疼的问题,你没有一台现成的装有 ...
- Linux中的安装神器--yum源安装
linux配置yum源 一.修改yum的配置文件 /etc/yum.repos.d/xxx.repo 1.进入yum配置文件目录 # cd /etc/yum.r ...
- PL/SQL Developer不安装客户端连接远程oracle数据库(转)
1.下载敏捷客户端InstantClient(40M左右,选择适合自己的下载,我的是instantclient-basic-win32-11.2.0.1.0.zip ):http://www.orac ...