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 ...
随机推荐
- Spark技术内幕:Stage划分及提交源码分析
http://blog.csdn.net/anzhsoft/article/details/39859463 当触发一个RDD的action后,以count为例,调用关系如下: org.apache. ...
- ie编程半天的学习总结
自己好久没有来这个博客了,自己陆续去几个地方写博客,一个c++博客园,一个csdn. 感觉都一般吧,看不到什么好的博客,可能自己没有看到吧.以后就在这个博客记录一点技术笔记吧!自己比较懒,只要做为记录 ...
- vue防止闪烁
v-text也可以 转意的话使用v-html <style> [v-clock]{ display:none } <style> <span>{{msg}}< ...
- struts2的java文件中不能直接弹出script对话框
需要引入接口 ServletResponseAware public class Login extends ActionSupport implements SessionAware,Servlet ...
- Java 与 Python 的对比
最近在学习Python, 现在写一个Python程序和Java程序进行对一下比,以此展示各自不同的特点.这个程序的功能是计算([n, m) )之间的闰年. Python程序如下: def fu ...
- OpenJudge 2680 化验诊断 C++
链接地址:http://bailian.openjudge.cn/practice/2680 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 下表是进行血常规检验的正常值参考范围 ...
- Qt-获取主机网络信息之QNetworkInterface
QNetworkInterface类提供了一个主机IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或者多个IP地 ...
- Cloudcraft: 云架构图形可视化(智能AWS图表)
Cloudcraft: 云架构图形可视化(智能AWS图表) 2016.09.11 官方网站: https://cloudcraft.co/ Cloudcraft是一个Web应用,用图形表示各种AWS服 ...
- memcached一些整理
.NET中使用Memcached的相关资源整理 Memcached官方站点:http://www.danga.com/memcached/ Memcached Win32 1.2.6下载: ...
- 设置Session的超时时间
设置Session的超时时间 IIS 里面有个设置 站点属性->主目录->应用程序配置->选项->启用会话状态->会话超时,可以设置. 在web.config中,设置: ...