又是红小豆写不出的矩阵问题

参考于:https://blog.csdn.net/qq_40942372/article/details/98778632

  

HDU-6638 Snowy Smile

  话说第七场才是打得心凉凉)

  场上枚举点wa了几发之后发现不能这样搞啊,然后就没有然后了。

  线段树维护动态最大子段和和看起来很聪明的亚子的枚举边界

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int t, n;
int x[2005], y[2005];
struct node
{
    int x, y;
    LL w;
}po[2005];

struct st
{
#define ls i<<1
#define rs i<<1|1

    struct node
    {
        LL pe, sr, ma, su;
    }p[2005 << 2];

    void puu(int i)
    {
        p[i].pe = max(p[ls].pe, p[ls].su + p[rs].pe);
        p[i].sr = max(p[rs].sr, p[ls].sr + p[rs].su);
        p[i].ma = max(p[ls].ma, max(p[rs].ma, p[ls].sr + p[rs].pe));
        p[i].su = p[rs].su + p[ls].su;

    }

    void build(int l, int r, int i)
    {
        p[i].pe = p[i].sr = p[i].su = p[i].ma = 0;
        if (l == r) return;
        int mid = (l + r) >> 1;
        build(l, mid, ls);
        build(mid + 1, r, rs);
    }

    void upd(int l, int r, int i, int x, LL w)
    {
        if (l == r) {
            p[i].su += w;
            p[i].ma = max(0ll, p[i].su);
            p[i].sr = max(0ll, p[i].su);
            p[i].pe = max(0ll, p[i].su);
            return;
        }
        int mid = (l + r) >> 1;
        if (mid < x)upd(mid + 1, r, rs, x, w);
        else upd(l, mid, ls, x, w);
        puu(i);
    }

    LL qy(int i, int l, int r, int ql, int qr)
    {
        return max(p[i].pe, max(p[i].sr, p[i].ma));
    }

}seg;

bool cmp(const node& a, const node& b) { if (a.y == b.y)return a.x < b.x; return a.y < b.y; }

int main()
{
    po[0].y = -0x3f3f3f3f;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d%d%lld", &x[i], &y[i], &po[i].w);
            po[i].x = x[i];
            po[i].y = y[i];
        }
        sort(x + 1, x + n + 1);
        int nx = unique(x + 1, x + n + 1) - x - 1;
        sort(y + 1, y + n + 1);
        int ny = unique(y + 1, y + n + 1) - y - 1;
        sort(po + 1, po + 1 + n, cmp);
        for (int i = 1; i <= n; i++) {
            po[i].x = lower_bound(x + 1, x + nx + 1, po[i].x) - x;
            po[i].y = lower_bound(y + 1, y + ny + 1, po[i].y) - y;
        }
        LL ans = 0ll;
        for (int i = 1; i <= n; i++) {
            while (po[i].y == po[i - 1].y)i++;
            seg.build(1, nx, 1);
            for (int j = i; j <= n; j++) {
                seg.upd(1, nx, 1, po[j].x, po[j].w);
                while (j < n && po[j + 1].y == po[j].y) {
                    j++;
                    seg.upd(1, nx, 1, po[j].x, po[j].w);
                }
                ans = max(ans, seg.qy(1, 1, nx, 1, nx));
            }
        }
        cout << ans << endl;
    }

    return 0;
}
Snowy Smile

  怎么说。。最近感觉到需要暂停一下了,能量峰型还是好难转每日任务型啊┓( ´∀` )┏

 posted on 2019-08-13 16:03  Nonad  阅读(190)  评论(0编辑  收藏  举报