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 ... 
随机推荐
- div居中的三种方法
			方法1: #div1{ width:200px; height:200px; background:green; position:absolute; left:0; top:0; right:0; ... 
- 【转】MyBatis学习总结(七)——Mybatis缓存
			[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ... 
- Could not find artifact com.sun:tools:jar:1.5.0解决方法
			可以参照在XP系统下搭建maven环境出的问题 Unable to locate the Javac Compiler in: C:\Program Files\Java\jre6\..\lib\to ... 
- Merge Into For Update Example
			Merge Into article aa Using ( SELECT md5_id, Min(article_id) as Min_Article_ID from article )) and s ... 
- is not in the sudoers file 解决(转)
			解决方案:首需要切换到root身份$su -(注意有- ,这和su是不同的,在用命令"su"的时候只是切换到root,但没有把root的环境变量传过去,还是当前用户的环境变量,用& ... 
- artice与section的区别
			<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ... 
- Python爬虫第一集
			import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.read() 简单 ... 
- springmvc学习(二)——使用RequestMapper请求映射
			本次内容是@RequestMapping,后面会有实例代码 Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求在控制器的类定义及方法定义处都可标注@ ... 
- QT 常用设置
			博文都写在了云笔记里面了,见谅,不想维护两个版本. QT 常用设置 
- 九度OJ 1513 二进制中1的个数
			题目地址:http://ac.jobdu.com/problem.php?pid=1513 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样 ... 
