P 3431AUT-The Bus

Posted wx62be51b466b43

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P 3431AUT-The Bus相关的知识,希望对你有一定的参考价值。

1.​​题目链接​​。切一道水题睡觉~~~~。有中文翻译就不说题意啦。本来说去写BZOJ 4237.瞅了一眼,大概是个CDQ,没仔细想,明天再写。

2.考虑dp[i]表示经过第i个点能够接到的最多的人,显然这个点只能由它的左下方转移过来。

                                DP[i]=max(DP[j])+p[i](jx<ix&&jy<iy)

树状数组加速一下(其实就是求个偏序)完事了。哦对了,记得离散化,显然只有1e5个点,1e9的数据离散化一下即可。

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct node
int x, y, val;
bool operator < (const node& b) const
return x ==b.x ? y < b.y : x < b.x;

p[N];
int c[N], y2[N];
int n, m, k;
int lowbit(int x)
return x & -x;


void add(int x, int ad)
while (x <= m)
c[x] = max(c[x], ad);
x += lowbit(x);



int query(int x)
int ans = 0;
while (x > 0)
ans = max(ans, c[x]);
x -= lowbit(x);

return ans;


int main()
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= k; i++)
scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].val);
y2[i] = p[i].y;

sort(y2 + 1, y2 + k + 1);
m = unique(y2 + 1, y2 + k + 1) - y2 - 1;
for (int i = 1; i <= k; i++)
p[i].y = lower_bound(y2 + 1, y2 + m+ 1, p[i].y) - y2;

sort(p + 1, p + k + 1);
int ans = 0;
for (int i = 1; i <= k; i++)
int tem = query(p[i].y) + p[i].val;
ans = max(ans, tem);
add(p[i].y, tem);

printf("%d\\n", ans);
return 0;

 


以上是关于P 3431AUT-The Bus的主要内容,如果未能解决你的问题,请参考以下文章

P3431 [POI2005]AUT-The Bus

[POI2005]AUT-The Bus

BZOJ 2004: [Hnoi2010]Bus 公交线路 [DP 状压 矩阵乘法]

poj 3431 Expedition 优先队列

Bus Number多重集合的排列

Oracle Service Bus Socket Adapter调整的参数