BZOJ 1537 Aut- The Bus

BIT.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100050
using namespace std;
long long n,m,k,hash[maxn],tot=0,t[maxn],f[maxn];
struct pnt
{
    long long x,y,w;
}p[maxn];
bool cmp(pnt x,pnt y)
{
    if (x.x!=y.x) return x.x<y.x;
    return x.y<y.y;
}
long long find(long long x)
{
    return lower_bound(hash+1,hash+tot+1,x)-hash;
}
long long lowbit(long long x) {return (x&(-x));}
long long ask(long long x)
{
    long long ret=0;
    for (long long i=x;i>=1;i-=lowbit(i))
        ret=max(ret,t[i]);
    return ret;
}
void modify(long long x,long long val)
{
    for (long long i=x;i<=tot;i+=lowbit(i))
        t[i]=max(t[i],val);
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    for (long long i=1;i<=k;i++)
    {
        scanf("%lld%lld%lld",&p[i].x,&p[i].y,&p[i].w);
        hash[++tot]=p[i].y;
    }
    k++;p[k].x=n;p[k].y=m;p[k].w=0;hash[++tot]=m;
    sort(p+1,p+k+1,cmp);sort(hash+1,hash+tot+1);tot=unique(hash+1,hash+tot+1)-hash-1;
    for (long long i=1;i<=k;i++)
    {
        long long ret=find(p[i].y);
        f[i]=ask(ret)+p[i].w;modify(ret,f[i]);
    }
    printf("%lld\n",f[k]);
    return 0;
}
时间: 2024-10-13 00:56:53

BZOJ 1537 Aut- The Bus的相关文章

BZOJ 1537: [POI2005]Aut- The Bus(dp + BIT)

对y坐标离散化, 然后按x坐标排序, dp. 一个点(x, y), 设到达这个点接到的最多乘客数为t, 那么t可以用来更新y'>=y的所有点.用树状数组维护最大值. --------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int maxn = 100009; int N; #def

Bzoj 1537: [POI2005]Aut- The Bus 题解 [由暴力到正解]

1537: [POI2005]Aut- The Bus Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 264[Submit][Status][Discuss] Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个数(i, j) 表示(1 <= i <= n, 1 <= j

【BZOJ】1537: [POI2005]Aut- The Bus

[算法]DP+线段树求区间max(二维偏序) [题解] 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]. 观察j的条件限制显然是二维偏序求最大值,套路化地离散化后一维排序+一维线段树即可解决. 最后在f[i]中找max,所以不用恢复原序. 复杂度O(n log n). #include<cstdio> #include<cstring> #include<cctype> #include<

BZOJ 1537 二维偏序

1 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <algorithm> 6 #include <map> 7 using namespace std; 8 const int Maxn=100100; 9 int n,m,k,c[Maxn],F[Maxn]; 10 map<int,int> M; 11 struct Info{int

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

题目链接: BZOJ - 2004 题目分析 看到题目完全不会..于是立即看神犇们的题解. 由于 p<=10 ,所以想到是使用状压.将每个连续的 p 个位置压缩成一个 p 位 2 进制数,其中共有 k 位是1,表示这 k 个位置是某辆 Bus 当前停下的位置.需要注意的是,每个状态的第一位必须是 1 ,这样保证了不会有重复的状态. 每个状态可以转移到右边的某些状态(由当前状态的第一个 1 移动).初始状态和终止状态都是前面 k 位是 1 .用矩阵转移 n - k 次. 代码 #include <

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

传送门 题意: $n$个公交站点,$k$辆车,$1...k$是起始站,$n-k+1..n$是终点站 每个站只能被一辆车停靠一次 每辆车相邻两个停靠位置不能超过$p$ 求方案数 $n \le 10^9,\ p \le 8,\ k \le 10$ 思考过程中遇到的主要问题是“所有车是同时前进的”,既不能单独考虑一辆车又没法考虑前面的车队后面的影响 正确的做法是同时考虑所有车 每$p$个位置一定每辆车各停一次 $f[i][s]$表示当前在站点$i$,且$i$有车,$s$为车停靠状态 强制规定最靠左(即

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比