杭电多校第六场 E Snowy Smile (线段树维护二维最大子段和)

本文介绍了一种使用线段树解决区间最大子段和问题的方法。通过枚举下界,固定下界后,上界的枚举与计算答案可以在O(n)的时间复杂度内完成。代码实现中,定义了线段树节点的数据结构,实现了线段树的建立、添加操作,以及主函数中的输入处理和结果输出。

题目链接

题解:

枚举上下边界,用线段树维护区间最大子段和。

具体的,首先枚举下界,固定下界的情况下,上界的枚举与计算答案并更新可以 O(n) 完成。

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define int ll
#define PI acos(-1.0)
#define INF 0x3f3f3f3f3f3f3f3f
#define P pair<int, int>
#define fastio ios::sync_with_stdio(false), cin.tie(0)
const int mod = 998244353;
const int M = 1000000 + 10;
const int N = 2000 + 10;

int t, n;
int ma[N<<2], lma[N<<2], rma[N<<2], sum[N<<2];
struct node {
    int x, y, w;
    bool operator < (const node &cmp) const {
        return y < cmp.y;
    }
} no[N];
int cpx[N], cntx, cpy[N], cnty;

void build(int l = 1, int r = cntx, int rt = 1)
{
    ma[rt] = lma[rt] = rma[rt] = sum[rt] = 0;
    if(l == r) return ;

    int mid = (l + r) >> 1;
    build(l, mid, rt << 1);
    build(mid + 1, r, rt << 1 | 1);

}

void add(int pos, int val, int l = 1, int r = cntx, int rt = 1)
{
    if(l == r) {
        sum[rt] += val;
        ma[rt] += val;
        lma[rt] += val;
        rma[rt] += val;
        return ;
    }

    int mid = (l + r) >> 1;
    if(pos <= mid) add(pos, val, l, mid, rt << 1);
    else add(pos, val, mid + 1, r, rt << 1 | 1);

    lma[rt] = max(lma[rt << 1], sum[rt << 1] + lma[rt << 1 | 1]);
    rma[rt] = max(rma[rt << 1 | 1], sum[rt << 1 | 1] + rma[rt << 1]);
    ma[rt] = max(max(ma[rt << 1], ma[rt << 1 | 1]), rma[rt << 1] + lma[rt << 1 | 1]);
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

signed main()
{
    fastio;
    cin >> t;
    while(t --) {
        cin >> n;
        for(int i = 1; i <= n; i ++) {
            cin >> no[i].x >> no[i].y >> no[i].w;
            cpx[i] = no[i].x, cpy[i] = no[i].y;
        }

        sort(cpx + 1, cpx + 1 + n);
        cntx = unique(cpx + 1, cpx + 1 + n) - cpx - 1;
        sort(cpy + 1, cpy + 1 + n);
        cnty = unique(cpy + 1, cpy + 1 + n) - cpy - 1;

        for(int i = 1; i <= n; i ++) {
            no[i].x = lower_bound(cpx + 1, cpx + 1 + cntx, no[i].x) - cpx;
            no[i].y = lower_bound(cpy + 1, cpy + 1 + cnty, no[i].y) - cpy;
        }

        sort(no + 1, no + 1 + n);

        int ans = 0;
        for(int i = 1; i <= cnty; i ++) {
            build();
            int now = 1;
            while(now <= n && no[now].y < i) now ++;
            for(int j = i; j <= cnty; j ++) {
                while(now <= n && no[now].y == j) {
                    add(no[now].x, no[now].w);
                    now ++;
                }
                ans = max(ans, ma[1]);
            }
        }
        cout << ans << endl;
    }
    return 0;
}

/*

  Rejoicing in hope, patient in tribulation.

*/

 

### Snowy 框架中的树形结构实现与应用 在现代企业级应用程序中,树形结构常用于展示具有层次关系的数据,如部门结构、菜单项等。Snowy-Layui作为一个现代化的Java RBAC权限管理系统,提供了强大的支持来处理这类需求[^1]。 #### 树形结构的设计理念 为了更好地管理操作这些分层数据,Snowy采用了基于实体类数据库表设计的方法。通常情况下,会有一个自关联字(例如`parentId`),用来指明节点之间的父关系。这种设计使得查询节点或者父节点变得非常简单高效。 #### 数据库建模实例 假设要创建一个简单的部门管理模块,在MySQL中可以这样定义表格: ```sql CREATE TABLE department ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), parent_id INT DEFAULT NULL, -- 表示上级部门ID FOREIGN KEY (parent_id) REFERENCES department(id) ); ``` 此SQL语句创建了一张名为`department`的表,其中包含了三个主要字:唯一标识符`id`、部门名称`name`以及指向其直接上级部门的外键`parent_id`。 #### 后端逻辑实现 对于后端部分,Spring Boot配合MyBatis Plus能够轻松完成CRUD操作。下面是一个获取指定根节点下所有后代节点的服务方法例: ```java @Service public class DepartmentService { @Autowired private DepartmentMapper mapper; public List<Department> getChildrenById(Integer rootId){ LambdaQueryWrapper<Department> query = new QueryWrapper<>(); query.eq(Department::getParentId,rootId); return this.mapper.selectList(query).stream().map(dept -> { dept.setChildren(getChildrenById(dept.getId())); return dept; }).collect(Collectors.toList()); } } ``` 上述代码片展示了如何递归地加载并设置每个部门下的部门列表。这里利用了Lambda表达式简化了遍历过程,并通过流的方式收集最终的结果集。 #### 前端显示方式 前端方面,Layui框架内置了一些组件可以直接拿来使用,比如Tree控件就可以很好地呈现这样的层级信息。只需要准备好JSON格式的数据源即可渲染出美观直观的效果图。 ```javascript layui.use(['tree'], function(){ var tree = layui.tree; // 构造模拟数据 var data = [ {title: '总公司', spread: true, children:[ {title:'市场部'}, {title:'技术部'} ]} ]; // 渲染 tree.render({ elem: '#demo' ,data: data }); }); ``` 这JavaScript脚本说明了怎样快速搭建一棵基础的企业组织架构图。实际项目里可以根据具体情况调整样式属性或增加交互事件监听器等功能特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值