USACO14MARザ・レイジーカウ(ゴールド)

タイトル

問題の意味:飛行機がある\(N- \)の芝生\(I \)草原ブロック座標\((X_I、Y_I)\) 上記持っている\(G_i \)草の単位を。ベッシーは以下の開始点から食べることができます(K \)\すべての草の(ここではマンハッタン距離です)。ヘルプへのベッシー選択開始は草を食べて、それを構成しています。

最初のターンからマンハッタンを参照してください\(45 \)度。ベッシーが食べるような芝生の広場の軸に平行です。

我々は、ベッシーが食べる芝生のために、ように、その出発点は、それがこの位置を開始点を選択された最大覆われた正方形である四角の軸に平行でなければならないことを見出しました。

十分に出、正方形、および走査線を保存することができ草の各。

#include<cstdio>
#include<cstring>
#include<algorithm>
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<b.y;}
int n,m,ans,x[N],y[N],value[N],tmp[N+N],k;
inline void Rotate(int&x,int&y){int tmpx=x,tmpy=y;x=tmpx+tmpy,y=tmpy-tmpx;}
signed main(){
    int l,r;
    scanf("%d%d",&n,&m);m<<=1;
    for(int i=1;i<=n;i++){
      scanf("%d%d%d",value+i,x+i,y+i);
      Rotate(x[i],y[i]);
      tmp[i]=x[i],tmp[i+n]=x[i]+m;
    }
    std::sort(tmp+1,tmp+1+n+n);
    k=0;
    tmp[0]=-1;
    for(int i=1;i<=n+n;i++)
      if(tmp[i]!=tmp[i-1])tmp[++k]=tmp[i];
    for(int i=1;i<=n;i++){
      l=std::lower_bound(tmp+1,tmp+1+k,x[i])-tmp;
      r=std::lower_bound(tmp+1,tmp+1+k,x[i]+m)-tmp;
      a[i]=(segment){l,r,y[i],value[i]};
      a[i+n]=(segment){l,r,y[i]+m,-value[i]};
    }
    std::sort(a+1,a+1+n+n,Cmp);
    for(int i=1;i<=n+n;i++){
      t.Add(a[i].l,a[i].r,a[i].f,1,n+n,1);
      ans=max(ans,t.Max());
    }
    printf("%d",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/Camp-Nou/p/11823551.html