洛谷 P3431:[POI2005]AUT-The Bus(离散化+DP+树状数组)
题目描述
The streets of Byte City form a regular, chessboardlike network - they are either north-south or west-east directed. We shall call them NS- and WE-streets. Furthermore, each street crosses the whole city. Every NS-street intersects every WE- one and vice versa. The NS-streets are numbered from \(1\) to \(n\), starting from the westernmost. The WE-streets are numbered from \(1\) to \(m\), beginning with the southernmost. Each intersection of the \(i\)'th NS-street with the \(j\)'th WE-street is denoted by a pair of numbers \((i,j)\) (for \(1\le i\le n\), \(1\le j\le m\)).
There is a bus line in Byte City, with intersections serving as bus stops. The bus begins its itinerary by the \((1,1)\) intersection, and finishes by the \((n,m)\) intersection. Moreover, the bus may only travel in the eastern and/or northern direction.
There are passengers awaiting the bus by some of the intersections. The bus driver wants to choose his route in a way that allows him to take as many of them as possible. (We shall make an assumption that the interior of the bus is spacious enough to take all of the awaiting passengers, regardless of the route chosen.)TaskWrite a programme which:
reads from the standard input a description of the road network and the number of passengers waiting at each intersection,finds, how many passengers the bus can take at the most,writes the outcome to the standard output.
Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个数(i, j) 表示(1 <= i <= n, 1 <= j <= m). Byte City里有一条公交线, 在某一些路口设置了公交站点. 公交车从 (1, 1) 发车, 在(n, m)结束.公交车只能往北或往东走. 现在有一些乘客在某些站点等车. 公交车司机希望在路线中能接到尽量多的乘客.帮他想想怎么才能接到最多的乘客.
输入格式
The first line of the standard input contains three positive integers \(n\), \(m\) and \(k\) - denoting the number of NS-streets, the number of WE-streets and the number of intersections by which the passengers await the bus, respectively \((1\le n\le 10^9, 1\le m\le 10^9, 1\le k\le 10^5)\).
The following \(k\) lines describe the deployment of passengers awaiting the bus, a single line per intersection. In the \((i+1)\)'st line there are three positive integers \(x_i, y_i\) and \(p_i\), separated by single spaces, \(1\le x_i\le n,1\le y_i\le m,1\le p_i\le 10^6\) . A triplet of this form signifies that by the intersection\((x_i,y_i)p_i\) passengers await the bus. Each intersection is described in the input data once at the most. The total number of passengers waiting for the bus does not exceed \(1\ 000\ 000\ 000\).
输出格式
Your programme should write to the standard output one line containing a single integer - the greatest number of passengers the bus can take.
输入输出样例
输入
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
思路
首先想到的是一个\(n\times m\)的DP,但是因为\(n,m\)均为\(10^9\),所以肯定是不行的
可以注意到,虽然\(n,m\)很大,但是点的个数却很少,只有\(10^5\)个,所以可以考虑将点先离散化,这样时间就从\(O(n\times m)降到了O(k^2)\),但是依旧会超时
这时,我们可以将每个点按横坐标升序,如果横坐标相同,纵坐标升序的顺序排序,然后进行DP
状态转移方程:\(dp[i]=max(dp[1],dp[2]...dp[i])+p[i]\)对于\(max(dp[i])\),可以用树状数组来求
代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=2e6+10;
const int mod=1e9+7;
const int maxm=1e3+10;
using namespace std;
struct wzy
{
int x,y,s;
}p[maxn];
int c[maxn];
int mapx[maxn],mapy[maxn];
bool cmp(wzy u,wzy v)
{
if(u.x==v.x)
return u.y<v.y;
return u.x<v.x;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int place,int num,int n)
{
while(place<=n)
{
c[place]=max(c[place],num);
place+=lowbit(place);
}
}
int query(int place)
{
int ans=0;
while(place>0)
{
ans=max(ans,c[place]);
place-=lowbit(place);
}
return ans;
}
int dp[maxn];
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("/home/wzy/in.txt", "r", stdin);
freopen("/home/wzy/out.txt", "w", stdout);
srand((unsigned int)time(NULL));
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
cin>>p[i].x>>p[i].y>>p[i].s;
mapx[i]=p[i].x;
mapy[i]=p[i].y;
}
// 离散化
sort(mapx+1,mapx+1+k);
sort(mapy+1,mapy+1+k);
int numx,numy;
numx=numy=k;
numx=unique(mapx+1,mapx+1+numx)-(mapx+1);
numy=unique(mapy+1,mapy+1+numy)-(mapy+1);
for(int i=1;i<=k;i++)
{
p[i].x=lower_bound(mapx+1,mapx+numx+1,p[i].x)-mapx;
p[i].y=lower_bound(mapy+1,mapy+numy+1,p[i].y)-mapy;
}
sort(p+1,p+1+k,cmp);
for(int i=1;i<=k;i++)
{
dp[i]=query(p[i].y)+p[i].s;
update(p[i].y,dp[i],k);
}
int ans=0;
for(int i=1;i<=k;i++)
ans=max(ans,dp[i]);
cout<<ans<<endl;
#ifndef ONLINE_JUDGE
cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
#endif
return 0;
}
洛谷 P3431:[POI2005]AUT-The Bus(离散化+DP+树状数组)的更多相关文章
- Codeforces 777E(离散化+dp+树状数组或线段树维护最大值)
E. Hanoi Factory time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 洛谷 P1975 [国家集训队]排队 Lebal:块内排序+树状数组
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- 洛谷 P2038 无线网络发射器选址 —— 二维树状数组
题目:https://www.luogu.org/problemnew/show/P2038 大水题暴露出我的愚蠢. 用二维树状数组,然而居然忘了它应该那样写,调了一个小时: 正方形可以超出外面,只要 ...
- 洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)
传送门 •题意 给你一个包含 n 个数的数组 $a$: 有 m 此操作,每次操作求区间 [l,r] 中不同数的个数: •题解(离线+树状数组) 以样例 $[1,2,3,4,3,5]$ 为例,求解区间 ...
- cf 61 E. Enemy is weak 离散化+树状数组
题意: 给出一个数组,数组的每一个元素都是不一样的,求出对于3个数组下标 i, j, k such that i < j < k and ai > aj > ak where ...
- POJ 2299 Ultra-QuickSort (离散化)+【树状数组】
<题目链接> 题目大意: 给你一段序列,问你如果每次只交换该序列相邻的两个元素,最少需要交换多少步才能够使该序列变为升序排列. 解题分析: 不难发现,其实本题就是让我们求原始序列的逆序对, ...
- POJ 2299 Ultra-QuickSort 离散化加树状数组求逆序对
http://poj.org/problem?id=2299 题意:求逆序对 题解:用树状数组.每读入一个数x,另a[x]=1.那么a数列的前缀和s[x]即为x前面(或者说,再x之前读入)小于x的个数 ...
- CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)
题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...
- codeforces 652D D. Nested Segments(离散化+sort+树状数组)
题目链接: D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
随机推荐
- 使用SpringBoot实现登录注册的几个问题
一.用户名密码都正确的情况下被登录拦截器拦截 控制台报错:org.apache.ibatis.executor.ExecutorException: A query was run and no Re ...
- Identity Server 4 从入门到落地(八)—— .Net Framework 客户端
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- 【Linux】【Basis】【Kernel】Linux常见系统调用
一,进程控制 1)getpid,getppid--获取进程识别号 #include <sys/types.h> #include <unistd.h> pid_t getpid ...
- python中numpy库ndarray多维数组的的运算:np.abs(x)、np.sqrt(x)、np.modf(x)等
numpy库提供非常便捷的数组运算,方便数据的处理. 1.数组与标量之间可直接进行运算 In [45]: aOut[45]:array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ ...
- 【Linux】【CentOS】【FTP】FTP服务器安装与配置(vsftpd、lftp)
[初次学习.配置的笔记,如有不当,欢迎在评论区纠正 -- 萌狼蓝天 @ 2021-12-02] 基本概念 FTP访问方式 实体账号:本地账户 来宾账户:guest 匿名登录:anonymous fp ...
- Gitlab Flow到容器
一.简介 长话短说,本文全景呈现我司项目组gitlab flow && devops Git Flow定义了一个项目发布的分支模型,为管理具有预定发布周期的大型项目提供了一个健壮的框架 ...
- tableau创建点位地图
一.双击省/自治区字段 二.双击销售额字段,标记类型改为圆 三.省/自治区字段设置标签显示,圆的大小和颜色细节调整,最终结果如下图所示
- Mybatis环境搭建及测试
1.新建java project,导入相应jar包 本次使用到的mybatis-3.2.7版本 mybatis需要jar包:mybatis-3.2.7.jar.lib文件下的依赖jar mysql驱动 ...
- wustctf2020_number_game
第一次碰到这种类型的题目,特地来记录一下 例行检查就不放了 int的取值范围[-2147482648,2147483647] 网上的解释: 绕过第9行的if即可获取shell,v1是无符号整型,我们输 ...
- 开源企业平台Odoo 15社区版之项目管理应用模块功能简介
项目管理无论是各类证书的认证,如PMP.软考高级的信息系统项目管理师.中级的系统集成项目管理工程师等,还是企业实践都有着广泛的实际应用中,至今还是处于热门的行业,合格的或优化的项目经理还是偏少,对于I ...