USACO14MAR The Lazy Cow(Gold)

题目

题意:平面上有 \(n\) 块草地,第 \(i\) 块草地坐标为 \((x_i,y_i)\) ,上面有 \(g_i\) 个单位的草。Bessie 可以吃到距离起始点不超过 \(k\)(这里是曼哈顿距离)的所有草。帮 Bessie 选定起始点使它能吃到最多的草。

看到曼哈顿距离,先转 \(45\) 度。这样 Bessie 吃的就是一个平行于坐标轴的正方形里的草。

我们发现,对于一块草地,使 Bessie 能吃到它的起始点也一定在一个平行于坐标轴的正方形里,那么被这种正方形覆盖最多的位置就是选定的起始点了。

对每块草地存下这样一个正方形,然后扫描线搞就好了。

#include
#include
#include
inline int max(int a,int b){return a>b?a:b;}
#define M (L+R>>1)
struct segment_tree{
    int mx[1<<19],lz[1<<19];
    void Down(int k){
        mx[k<<1]+=lz[k];lz[k<<1]+=lz[k];
        mx[k<<1|1]+=lz[k];lz[k<<1|1]+=lz[k];
        lz[k]=0;
    }
    void Add(int l,int r,int a,int L,int R,int k){
        if(l<=L&&R<=r){mx[k]+=a;lz[k]+=a;return;}
        Down(k);
        if(l<=M)Add(l,r,a,L,M,k<<1);
        if(r>M)Add(l,r,a,M+1,R,k<<1|1);
        mx[k]=max(mx[k<<1],mx[k<<1|1]);
    }
    int Max(){return mx[1];}
}t;
const int N=1e5+3;
struct segment{int l,r,y,f;}a[N+N];
bool Cmp(const segment&a,const segment&b){return a.y==b.y?a.f>b.f:a.y

你可能感兴趣的:(USACO14MAR The Lazy Cow(Gold))