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的数据离散化一下即可。
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的主要内容,如果未能解决你的问题,请参考以下文章