2019 Multi-University Training Contest 6 1005 Snowy Smile —— 线段树

This way

题意:

空间中有n个点,让你选择一个矩形覆盖一些点或者不覆盖任何点使得这个矩形中所有点的和最大。

题解:

虽然貌似它是个2000*2000的矩阵,但是它有的点只有2000个。所以我们先按照x轴排序,然后枚举左端点的同时枚举右端点,意思是固定左右端点,一定包括这两个点的最大子矩阵是多少。用线段树维护区间前缀和,然后查上面的最大前缀和-下面的最小前缀和,就像下图:
2019 Multi-University Training Contest 6 1005 Snowy Smile —— 线段树_第1张图片
但是有一个很重要的剪枝,也就是在每次查询之前看看mx[1]-max(0ll,mi[1])是否小于等于ans,如果是的话就没必要往下做了。虽然不严谨,但是对于答案是不会有影响的。

#include
//#pragma GCC optimize(2)
using namespace std;
#define ll long long
const int N=2e3+5;
const ll inf=1e18;
int dis_x[N],dis_y[N];
ll mi[N*4],mx[N*4],flag[N*4],pre[N*4];
struct node
{
    int x,y;
    ll w;
    bool operator< (const node& a)const
    {
        return xhave[N];
void push_down(int root)
{
    if(flag[root]==inf)
        return ;
    mi[root<<1]+=flag[root];
    mi[root<<1|1]+=flag[root];
    mx[root<<1]+=flag[root];
    mx[root<<1|1]+=flag[root];
    flag[root<<1]+=flag[root];
    flag[root<<1|1]+=flag[root];
    flag[root]=0;
}
void update(int l,int r,int root,int ql,int qr,ll v)
{
    if(l>=ql&&r<=qr)
    {
        mi[root]+=v;
        mx[root]+=v;
        flag[root]+=v;
        return ;
    }
    push_down(root);
    int mid=l+r>>1;
    if(mid>=ql)
        update(l,mid,root<<1,ql,qr,v);
    if(mid=ql&&r<=qr)
        return mi[root];
    push_down(root);
    int mid=l+r>>1;
    ll ans=inf;
    if(mid>=ql)
        ans=q_mi(l,mid,root<<1,ql,qr);
    if(mid=ql&&r<=qr)
        return mx[root];
    push_down(root);
    int mid=l+r>>1;
    ll ans=-inf;
    if(mid>=ql)
        ans=q_mx(l,mid,root<<1,ql,qr);
    if(mid0?q_mi(1,all_y,1,1,l-1):0ll;
                if(minn<=0)
                    ans=max(ans,maxn-minn);
                else
                    ans=max(ans,maxn);
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
/*
10
7
1 1 -1000000000
1 2 2000000000
1 3 3000000000
2 2 -2000000000
2 3 -2000000000
3 2 4000000000
3 3 5000000000
10
8
1 3 20
1 5 -30
1 7 10
5 5 60
5 2 -140
5 1 120
4 1 -130
2 8 -111


8
1 3 40
1 5 -30
1 7 10
5 5 60
5 2 -140
5 1 120
4 1 -130
2 8 -111

*/

你可能感兴趣的:(想法,线段树)