zoukankan      html  css  js  c++  java
  • BZOJ 4716 假摔

    我们发现我们可以对每一个点维护其还没有用过的矩形中最小的几个,记得判重。

    #pragma GCC optimize("-O2")
    #include<bits/stdc++.h>
    using namespace std;
    #define sight(c) ('0'<=c&&c<='9')
    #define LL long long
    #define M 1007
    inline void read(int &x){
        static char c; static int b;
        for (b=1,c=getchar();!sight(c);c=getchar()) if (c=='-') b=-1;
        for (x=0;sight(c);c=getchar())x=x*10+c-48; x=x*b;
    }
    LL sum[M][M];
    struct state{
        int x,y,lx,ly;
        LL ans;
        state() {}
        state(int _x,int _y,int _lx,int _ly):x(_x),y(_y),lx(_lx),ly(_ly){
            ans=sum[_x-1+lx][_y-1+ly]+sum[_x-1][_y-1]-sum[_x-1+lx][_y-1]-sum[_x-1][_y-1+ly];
        }
        inline bool operator <(const state& P)const&{
            return
             P.ans==ans?
              (P.x==x?
               (P.y==y?
                (P.lx==lx?
                  P.ly<ly:
                   P.lx<lx):
                    P.y<y):
                     P.x<x):  
                      P.ans<ans;
        }
    }Now;
    #define N 2346007
    state hep[N];
    int len,n,m,xm,ym,K,ax;
    map<state,bool> mp;
    void write(LL x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(LL x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
    '); }
    inline void writel(LL x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
    void put(state P){hep[++len]=P,push_heap(hep+1,hep+1+len);}
    inline state get() {pop_heap(hep+1,hep+1+len);return hep[len--];}
    signed main () {
        read(n); read(m); read(xm); read(ym); 
        read(K);
        for (int i=1;i<=n;i++)
         for (int j=1;j<=m;j++) read(ax),sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+ax;
        for (int i=1;i<=n-xm+1;i++)
         for (int j=1;j<=m-ym+1;j++)  put(state(i,j,xm,ym));
    //  for (int i=1;i<=len;i++) hep[i].we();
        while (K--) {
            while (Now=get(),1) {
                if (!mp[Now]) break;
            }
            mp[Now]=1;
    //      writel(Now.x); writel(Now.y); writel(Now.lx); writel(Now.ly); writeln(Now.ans);
            if (Now.x+Now.lx<=n) put(state(Now.x,Now.y,Now.lx+1,Now.ly));
            if (Now.y+Now.ly<=m) put(state(Now.x,Now.y,Now.lx,Now.ly+1));
        }
        writeln(Now.ans+1); return 0;
    }
  • 相关阅读:
    PetShop数据访问层之消息处理 《解剖PetShop》系列之三
    正则过滤汉字
    c语言 断点续传3
    c 写cgi 与socket通信
    C 语言 断点续传2
    承接B2C商城定制开发 空间+域名+风语商城系统=¥4000
    16进制 SQL注入
    c# socket传送大文件
    c写cgi cookies 设置与读取
    cgi 操作封装
  • 原文地址:https://www.cnblogs.com/rrsb/p/9255883.html
Copyright © 2011-2022 走看看