P3431 [POI2005]AUT-The Bus
Posted hkttg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3431 [POI2005]AUT-The Bus相关的知识,希望对你有一定的参考价值。
P3431 [POI2005]AUT-The Bus
题目描述
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 111 to nnn , starting from the westernmost. The WE-streets are numbered from 111 to mmm , beginning with the southernmost. Each intersection of the iii ‘th NS-street with the jjj ‘th WE-street is denoted by a pair of numbers (i,j)(i,j)(i,j) (for 1≤i≤n1le ile n1≤i≤n , 1≤j≤m1le jle m1≤j≤m ).
There is a bus line in Byte City, with intersections serving as bus stops. The bus begins its itinerary by the (1,1)(1,1)(1,1) intersection, and finishes by the (n,m)(n,m)(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 nnn , mmm and kkk - 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≤n≤1091le nle 10^91≤n≤109 , 1≤m≤1091le mle 10^91≤m≤109 , 1≤k≤1051le kle 10^51≤k≤105 ).
The following kkk lines describe the deployment of passengers awaiting the bus, a single line per intersection. In the (i+1)(i+1)(i+1) ‘st line there are three positive integers xix_ixi? , yiy_iyi? and pip_ipi? , separated by single spaces, 1≤xi≤n1le x_ile n1≤xi?≤n , 1≤yi≤m1le y_ile m1≤yi?≤m , 1≤pi≤1061le p_ile 10^61≤pi?≤106 . A triplet of this form signifies that by the intersection (xi,yi)pi(x_i,y_i)p_i(xi?,yi?)pi? 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 0001 000 000 0001 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
————————————————————————————————————————————————————————————————————————
日常DP
code
#include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <vector> #define R register const int MAXN = 100010; int n, m, k; int b[MAXN], f[MAXN], ans, cnt; struct POS{ int x, y, num; bool operator < (const POS &t) const { if (x == t.x) return y < t.y; return x < t.x; } }p[MAXN]; inline int read() { int num = 0, f = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == ‘-‘) f = -1; ch = getchar();} while (isdigit(ch)) {num = num * 10 + ch - ‘0‘; ch = getchar();} return num * f; } int t[MAXN]; int Lowbit(int x) {return x&(-x);} void Update(int x, int k) {while(x<=cnt)t[x]=std::max(t[x],k),x+=Lowbit(x);} int Query(int x) {int d=0;while(x>0)d=std::max(d,t[x]),x-=Lowbit(x);return d;} int main() { n = read(); m = read(); k = read(); for (R int i = 1; i <= k; ++ i) { p[i].x = read(), p[i].y = read(), p[i].num = read(); b[i] = p[i].y; } std::sort(b + 1, b + k + 1); cnt = std::unique(b + 1, b + k + 1) - (b + 1); for (R int i = 1; i <= k; ++ i) p[i].y = std::lower_bound(b + 1, b + cnt + 1, p[i].y) - b; std::sort(p + 1, p + k + 1); for (int i = 1; i <= k; ++ i) { f[i] = Query(p[i].y) + p[i].num; ans = std::max(f[i], ans); Update(p[i].y, f[i]); } std::cout << ans << std::endl; }
以上是关于P3431 [POI2005]AUT-The Bus的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ1537][POI2005]Aut- The Bus
[Luogu3425][POI2005]KOS-Dicing