RQNOJ Bus
H城是一座小城市,前几日才刚刚建立公交系统,且只有一辆公交车。于是,如何最大化这唯一一辆公交车的载客量成了亟待解决的问题。
H城的俯视图可以近似地看成是一个棋盘网络——共有N行M列,从南向北,每行从1到M标号,从西向东,每列从1到N标号。经实地考察,公交总公司选定了K个可以设为站点的地方,其中第K个站点位于第Xi列,第Yi行,预计每天有Pi名乘客需要在此乘车。
设有序数对(X,Y)表示第X列,第Y行。每天,公交车从(1,1)开出,驶向(N,M),途中只能向北或向东行驶。
现在,公交总公司希望你能够帮助他们选定一条路线,使得能够接到的乘客数最大,我们假设公交车的容量无限大。
一个非负整数ans,表示最多能接到的乘客数。
若干行,对于每个询问输出’Yes’表示他们是亲戚,或’No’表示他们不是亲戚
8 7 11
4 3 4
6 2 4
2 3 2
5 6 1
2 5 2
1 5 5
2 1 1
3 1 1
7 7 1
7 4 2
8 6 2
11

如果把每个点看成一个状态,F[x,y]表示最大人数,那么它只能从它下面或者左边的点转移过来,于是每次就是找到一个x,y都小于等于该点的最大的F[X,Y]。这实际上是一个加权LIS,但是权值和坐标值都很大,于是想到用分治代替平衡树的方法来维护。
我们先给x排序离散好,这里要满足x相等的点y小的在前面。然后把y快排好,进入分治。
对于每次分治[l,r],我们的任务是用[l,mid]的F去更新[mid+1,r]的F(因为右半边的F值只受左半边的影响,大概类似NOI Cash那个题)。由于我们已经排好了y,那么分治的下标其实就是x,于是对于每个[l,r]过程,我们要把它按照x相对mid的大小分成两个部分[l,mid],[mid+1,r],这两部分分别是y单增的。
然后,左半边[l,mid]维护一个y和F都单调增的数组,然后扫一遍右半边[mid+1,r],找到不小于这个点y值得最靠右的一个F(也就是最大的F),转移即可。
更新完F值,我们需要把分开的两部分合并起来,也就是归并排序,保证回溯到上一层的时候[l,r]仍然是y单增的。
需要注意的是,由于每次要拆了又合,所以F的下标很乱,不如直接把F记到每个点上,这样随着分治的过程,F值会始终跟着这个点分来分去。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define maxn 102000
using namespace std; struct point
{
int x,y,v,f;
}p[maxn],q[maxn],stack[maxn];
int f[maxn];
int nx,ny,n,ans; void solve(int l,int r)
{
if (l==r){
if (p[l].f==) p[l].f=p[l].v;
ans=max(ans,p[l].f);
return ;
}
int mid=(l+r)>>;
int l1=l,l2=mid+;
for (int i=l;i<=r;i++) if (p[i].x<=mid) q[l1++]=p[i]; else q[l2++]=p[i];
for (int i=l;i<=r;i++) p[i]=q[i];
solve(l,mid);
int top=;
for (int i=l;i<=mid;i++){
if (p[i].f>stack[top].f) stack[++top]=p[i];
}
int now=;
for (int i=mid+;i<=r;i++){
while (now<top&&stack[now+].y<=p[i].y) now++;
if (now) p[i].f=max(p[i].f,stack[now].f+p[i].v);
}
solve(mid+,r);
l1=l,l2=mid+;
for (int i=l;i<=r;i++)
if ((p[l1].y<=p[l2].y||l2>r)&&l1<=mid) q[i]=p[l1++]; else q[i]=p[l2++];
for (int i=l;i<=r;i++) p[i]=q[i];
} bool cmp1(point a,point b)
{
return (a.x<b.x)||(a.x==b.x&&a.y<b.y);
}
bool cmp2(point a,point b)
{
return a.y<b.y;
} int main()
{
freopen("bus.in","r",stdin);
freopen("bus.out","w",stdout);
scanf("%d%d%d",&nx,&ny,&n);
for (int i=;i<=n;i++)
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);
sort(p+,p+n+,cmp1);
for (int i=;i<=n;i++) p[i].x=i;
sort(p+,p+n+,cmp2);
solve(,n);
printf("%d\n",ans);
return ;
}
Bus
RQNOJ Bus的更多相关文章
- 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)
关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...
- RQNOJ 490 环形石子合并
题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...
- Matlab中使用脚本和xml文件自动生成bus模块
帮一个老师写的小工具 在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫 所以用xml配置文件来写,也便于更 ...
- bzoj 1537: [POI2005]Aut- The Bus 线段树
bzoj 1537: [POI2005]Aut- The Bus 先把坐标离散化 设f[i][j]表示从(1,1)走到(i,j)的最优解 这样直接dp::: f[i][j] = max{f[i-1][ ...
- linux下bus、devices和platform的基础模型
转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核 ...
- ACE bus
ACE bus增加的内容: 1):5状态的cache model 2):关于coherency的additional signal 3):两个cache master访问shared cache的ad ...
- 利用Service bus中的queue中转消息
有需求就有对策就有市场. 由于公司global的policy,导致对公司外发邮件的service必须要绑定到固定的ip地址,所以别的程序需要调用发邮件程序时,问题就来了,如何在azure上跨servi ...
- c程序中出现segment error 和 bus error 的原因
在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...
- Azure Service Bus 中的身份验证方式 Shared Access Signature
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
随机推荐
- pdf转word
一.刚需 pdf转word,这个需求肯定是有的.但是大家都知道,pdf是用来排版打印的,所以编辑起来会比较麻烦,所以,大家都会尝试将pdf的内容转成word,然后再进行编辑. 二.方法 1.用offi ...
- 19.创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。
package zuoye2; public class People { protected double height; protected double weight; private Stri ...
- 【HDU4585 Shaolin】map的经典运用
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585 题意大意:很多人想进少林寺,少林寺最开始只有一个和尚,每个人有有一个武力值,若这个人想进少林,必 ...
- Python数据类型(3)
字符串(str):单引号''.双引号""嵌套使用,可以不使用转义字符:'abc"dd"ef'."acc'd'12",字符串不可以是多行的三单 ...
- c++之map
题目描述: 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮 ...
- lsof 一切皆文件
Docs » 工具参考篇 » 3. lsof 一切皆文件 Docs » 工具参考篇 » 3. lsof 一切皆文件 Edit on GitHub 3. lsof 一切皆文件¶ lsof(list op ...
- 如何使用 vimdiff 来 git diff /svn diff
#git 如何实现vimdiffgit config --global diff.tool vimdiff git config --global difftool.prompt false git ...
- javaWeb中servlet开发(3)——Servlet生命周期
生命周期:是一个程序的存在周期,servlet由于是受容器的管理,所以容器来决定其生命周期 1.servlet生命周期 2.servlet生命周期对应的方法 3.servlet生命周期代码 publi ...
- symmetric multiprocessor
https://en.wikipedia.org/wiki/Symmetric_multiprocessor_system A symmetric multiprocessor system (SMP ...
- 【java基础学习】线程
线程 1. 两种创建方式(继承Thread类和实现Runnable接口) 2. 线程共享资源(建议实现Runnable接口,其好处是:1.多线程之间可以共享资源 2.避免单继承带来的问题 3.数据和代 ...