题意:

求一个子矩阵要求其矩阵内的合最大。

题解:

正常的求最大子矩阵的复杂度是O(n^3)

对于这一题说复杂度过不去,注意到这个题总共只有2000个点关键点在与这里优化

最大子矩阵可以压缩矩阵变成最大字段和问题

然后可以通过带修改的最大字段和维护这2000个点,复杂度就变成了了O(n^2logn)

将算出每一列的合的操作 用待修改的最大字段和的线段树维护。

 #include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <set>
#include <iostream>
#include <map>
#include <stack>
#include <string>
#include <vector>
#define pi acos(-1.0)
#define eps 1e-9
#define fi first
#define se second
#define rtl rt<<1
#define rtr rt<<1|1
#define bug printf("******\n")
#define mem(a,b) memset(a,b,sizeof(a))
#define name2str(x) #x
#define fuck(x) cout<<#x" = "<<x<<endl
#define f(a) a*a
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
#define pf printf
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)+
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define FIN freopen("data.txt","r",stdin)
#define gcd(a,b) __gcd(a,b)
#define lowbit(x) x&-x
#define rep(i,a,b) for(int i=a;i<b;++i)
#define per(i,a,b) for(int i=a-1;i>=b;--i)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int maxn = + ;
const int maxm = 8e6 + ;
const int mod = 1e9 + ;
const int INF = 0x3f3f3f3f;
int T, n;
LL s[maxn], x[maxn], y[maxn], a[maxn], b[maxn], w[maxn], mp[maxn][maxn];
struct Segtree {
LL maxx, vl, vr, sum, fg; } Tree[maxn << ];
void updata ( int rt ) {
Tree[rt].maxx = max ( Tree[rtl].maxx, max ( Tree[rtr].maxx, Tree[rtl].vr + Tree[rtr].vl ) );
Tree[rt].sum = Tree[rtl].sum + Tree[rtr].sum;
Tree[rt].vl = max ( Tree[rtl].vl, Tree[rtl].sum + Tree[rtr].vl );
Tree[rt].vr = max ( Tree[rtr].vr, Tree[rtr].sum + Tree[rtl].vr );
}
void build ( int l, int r, int rt ) {
Tree[rt].fg = true;
if ( l == r ) {
Tree[rt].sum = s[l];
Tree[rt].maxx = s[l];
Tree[rt].vl = s[l];
Tree[rt].vr = s[l];
return ;
}
int mid = ( l + r ) >> ;
build ( l, mid, rtl );
build ( mid + , r, rtr );
updata ( rt );
}
void add ( int l, int r, int rt, int pos, int to ) {
if ( l > pos || r < pos ) return ;
if ( l == r ) {
Tree[rt].sum += to;
Tree[rt].maxx += to;
Tree[rt].vl += to;
Tree[rt].vr += to;
return ;
}
int mid = ( l + r ) >> ;
add ( l, mid, rtl, pos, to );
add ( mid + , r, rtr, pos, to );
updata ( rt );
}
Segtree query ( int l, int r, int rt, int sa, int se ) {
if ( sa <= l && r <= se ) return Tree[rt];
int mid = ( l + r ) >> ;
if ( sa > mid ) return query ( mid + , r, rtr, sa, se );
if ( se <= mid ) return query ( l, mid, rtl, sa, se );
Segtree t, lson, rson;
lson = query ( l, mid, rtl, sa, se );
rson = query ( mid + , r, rtr, sa, se );
t.vl = max ( lson.vl, lson.sum + rson.vl );
t.vr = max ( rson.vr, lson.vr + rson.sum );
t.maxx = max ( lson.vr + rson.vl, max ( lson.maxx, rson.maxx ) );
return t;
}
vector<LL>v[maxn];
int main() {
// FIN;
sf ( T );
while ( T-- ) {
sf ( n );
for ( int i = ; i <= n ; i++ ) {
scanf ( "%lld%lld%lld", &x[i], &y[i], &w[i] );
a[i] = x[i], b[i] = y[i];
v[i].clear();
}
sort ( a + , a + + n ), sort ( b + , b + + n );
int len1 = unique ( a + , a + + n ) - a - ;
int len2 = unique ( b + , b + + n ) - b - ;
for ( int i = ; i <= n ; i++ ) for ( int j = ; j <= n ; j++ ) mp[i][j] = ;
for ( int i = ; i <= n ; i++ ) {
x[i] = lower_bound ( a + , a + + len1, x[i] ) - a;
y[i] = lower_bound ( b + , b + + len2, y[i] ) - b;
mp[y[i]][x[i]] += w[i];
}
for ( int i = ; i <= n ; i++ )
for ( int j = ; j <= n ; j++ )
if ( mp[i][j] ) v[i].push_back ( j );
LL ans = ;
for ( int i = ; i <= n ; i++ ) {
for ( int j = ; j <= n ; j++ ) s[j] = mp[i][j];
build ( , n, );
ans = max ( ans, query ( , n, , , n ).maxx );
for ( int j = i + ; j <= n ; j++ ) {
for ( int k = ; k < v[j].size() ; k++ ) {
add ( , n, , v[j][k], mp[j][v[j][k]] );
}
ans = max ( ans, query ( , n, , , n ).maxx );
}
}
printf ( "%lld\n", ans );
}
return ;
}

2019 Multi-University Training Contest 6 Snowy Smile (最大字段和变形)的更多相关文章

  1. 2019 Nowcoder Multi-University Training Contest 4 E Explorer

    线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...

  2. 2019 Nowcoder Multi-University Training Contest 1 H-XOR

    由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...

  3. HDU校赛 | 2019 Multi-University Training Contest 6

    2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...

  4. 2019 Multi-University Training Contest 8

    2019 Multi-University Training Contest 8 C. Acesrc and Good Numbers 题意 \(f(d,n)\) 表示 1 到 n 中,d 出现的次数 ...

  5. 2019 Multi-University Training Contest 7

    2019 Multi-University Training Contest 7 A. A + B = C 题意 给出 \(a,b,c\) 解方程 \(a10^x+b10^y=c10^z\). tri ...

  6. 2019 Multi-University Training Contest 1

    2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...

  7. 2019 Multi-University Training Contest 2

    2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...

  8. 2019 Multi-University Training Contest 5

    2019 Multi-University Training Contest 5 A. fraction upsolved 题意 输入 \(x,p\),输出最小的 \(b\) 使得 \(bx\%p&l ...

  9. HDU校赛 | 2019 Multi-University Training Contest 5

    2019 Multi-University Training Contest 5 http://acm.hdu.edu.cn/contests/contest_show.php?cid=852 100 ...

随机推荐

  1. 单源最短路径问题2 (Dijkstra算法)

    用邻接矩阵 /* 单源最短路径问题2 (Dijkstra算法) 样例: 5 7 0 1 3 0 3 7 1 2 4 1 3 2 2 3 5 2 4 6 3 4 4 输出: [0, 3, 7, 5, 9 ...

  2. 在myeclipse安装beyond插件

    目录 文章背景 目录 环境介绍 安装步骤 说明 参考文章 版本记录 文章背景 myeclipse自带的比较工具感觉是有一些看不清晰,也不是太方便处理,然后就找了个比较插件了. 目录 环境介绍 myec ...

  3. linux环境下创建domain

    首先进入weblogic的安装目录,具体如下: cd /wls/Oracle/Middleware/Oracle_Home/wlserver/common/bin 图形化创建 1.下载xmanager ...

  4. 李宏毅机器学习课程---2、Regression - Case Study

    李宏毅机器学习课程---2.Regression - Case Study 一.总结 一句话总结: 分类讨论可能是比较好的找最佳函数的方法:如果 有这样的因素存在的话 模型不够好,可能是因素没有找全 ...

  5. LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)

    题目标签:Math 题目让我们判断机器人是否是一直在走一个圈. 当我们把 instructions 走完一遍时候: 1. 如果机器人回到了原点,那么它是在走一个圈. 2. 如果机器人的方向没有改变,那 ...

  6. scrapy爬取cnblogs文章列表

    scrapy爬取cnblogs文章 目标任务 安装爬虫 创建爬虫 编写 items.py 编写 spiders/cnblogs.py 编写 pipelines.py 编写 settings.py 运行 ...

  7. (转)HashSet<T>类

    转载于:http://www.importnew.com/6931.html HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复 ...

  8. Delphi 2010 中的泛型

    Delphi 2010 中的泛型 2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了一下,发现下面这篇文章,还不错,大家一起补补课吧! C++中的模板.C ...

  9. 将Mysq数据导入solr索引库

    本文的基础环境都是在centos 64bit,jdk1.7.79 将mysql 的jar 包添加到/home/hadoop/cloudsolr/solr-4.10.4/contrib/dataimpo ...

  10. 编译Solr4.72 源码没有成功

    最近需要用到solr,查询Hbase里面的数据,编译Solr的时候遇到了点问题: 下了solr的源码后需要用ant自己编译: 源码下载地址:https://svn.apache.org/repos/a ...