首页 > 其他分享 >CodeForces - 15D Map

CodeForces - 15D Map

时间:2022-11-18 20:01:38浏览次数:46  
标签:Map int sum CodeForces vis tail 15D row define

题意:要在一片n*m的地上盖一个a*b的房子。这片地参差不齐,如果选定一个a*b的区域盖房子的话,需要把这片地铲地和最低点一样平,消耗的代价为铲掉高度之和。按代价大小求所有不重叠的房子,如果代价相同,靠上的优先;如果在同一行,靠左的优先。

解:枚举每个点,在以这个点为右下角盖房子,消耗的代价为这片区域高度之和减去最低点乘以区域面积。高度之和可以用二位前缀和维护,区域最低点可以跑两遍优先队列O(mn)地求出。然后排序,判断一下有没有重叠,输出。

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxx 1005
#define maxn 25
#define maxm 205
#define ll long long
#define inf 1000000009
#define mod 2520
struct node{
    ll x,y,w;
    bool operator < (const node &a) const{
        if(w==a.w) {
            if (x == a.x) {
                return y < a.y;
            }
            return x<a.x;
        }
        return w<a.w;
    }
    node(ll xx,ll yy,ll ww){
        x=xx;y=yy;w=ww;
    }
};
ll n,m,a,b;
ll c[maxx][maxx];
ll row[maxx][maxx]={0},col[maxx][maxx]={0};
ll sum[maxx][maxx]={0};
int vis[maxx][maxx]={0};
int q[maxx]={0};
vector<node> v;
ll cal(int x,int y){
    return sum[x][y]-sum[x-a][y]-sum[x][y-b]+sum[x-a][y-b];
}
signed main() {
    scanf("%I64d%I64d%I64d%I64d",&n,&m,&a,&b);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%I64d",&c[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        int head=1,tail=0;
        for(int j=1;j<=m;j++){
            while(head<=tail&&q[head]<j-b+1) head++;
            while(head<=tail&&c[i][q[tail]]>=c[i][j]) tail--;
            q[++tail]=j;
            row[i][j]=c[i][q[head]];
        }
    }
    for(int j=1;j<=m;j++){
        int head=1,tail=0;
        for(int i=1;i<=n;i++){
            while(head<=tail&&q[head]<i-a+1) head++;
            while(head<=tail&&row[q[tail]][j]>=row[i][j]) tail--;
            q[++tail]=i;
            col[i][j]=row[q[head]][j];
        }
    }
//    for(int i=1;i<=n;i++){
//        for(int j=1;j<=m;j++){
//            printf("%d ",row[i][j]);
//        }
//        printf("\n");
//    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+c[i][j];
        }
    }
    for(int i=a;i<=n;i++){
        for(int j=b;j<=m;j++){
            v.push_back(node(i,j,cal(i,j)-a*b*col[i][j]));
        }
    }
    sort(v.begin(),v.end());
    vector<node> ans;
    for(auto [x,y,z]:v){
        if(vis[x][y]||vis[x-a+1][y]||vis[x][y-b+1]||vis[x-a+1][y-b+1]) continue;
        ans.push_back(node(x-a+1,y-b+1,z));
        for(int i=x-a+1;i<=x;i++){
            for(int j=y-b+1;j<=y;j++){
                vis[i][j]=1;
            }
        }
    }
    printf("%d\n",ans.size());
    for(auto [x,y,z]:ans){
        printf("%I64d %I64d %I64d\n",x,y,z);
    }
    return 0;
}
//dp[i][j]
View Code

 

标签:Map,int,sum,CodeForces,vis,tail,15D,row,define
From: https://www.cnblogs.com/capterlliar/p/16904760.html

相关文章

  • 三、@RequestMapping注解
                      ......
  • Hadoop序列化之MapReduce案例
    Hadoop序列化序列化概述序列化就是把内存中的对象、转换成字节系列(或者其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。反序列化就是将收到字节序列(或其他数据传输......
  • Codeforces Round #673 (Div. 2) Problem A
    今天的题。本来打算把比赛坚持打完的,但是因为生病了,还是早点睡吧,把第一题摸了。题面如下:BTheroisapowerfulmagician.Hehasgotnpilesofcandies,thei-thpile......
  • Codeforces Round #672 (Div. 2) ProblemB
    9月25日的打卡。为什么又过了零点?因为和朋友去摸鱼了。今天讲一下昨晚比赛的第二题。题面如下:Danikurgentlyneedsrockandlever!Obviously,theeasiestwaytoge......
  • Codeforces Round #672 (Div. 2) Problem A
    今日份的题目。(指9月24日,因为比赛从晚上10点半持续到12点半)问题A是水题,题面如下(大半夜了,就不翻译了,赶着睡觉)(其他题目明天再发)Wheatleydecidedtotrytomakeatestcha......
  • Mybatis中的自带Mapper方法
    mybatis逆向工程生成的mapper源码:importcom.itheima.springmvc.pojo.Items;importcom.itheima.springmvc.pojo.ItemsExample;importjava.util.List;importorg.apache.ib......
  • Global Mapperv17 裁剪dem并导出等高线
    1、加载dem数据数据投影2、加载shp范围3、选中范围数据4、裁剪5、生成等高线6、导出等高线矢量......
  • codeforces 2000左右dp题目练习
    栾巨的dp题单,刷完他要v我500可以提升dp水平。1.YaroslavandTwoStrings白给题,令\(f_{i,0/1,0/1}\)表示前\(i\)位,有无小于,有无大于,根据每位的字符转移即可。2.To......
  • C#中Byte[]数组、BitmapImage、BitmapSource互转
    原文:https://blog.csdn.net/dap769815768/article/details/127105330?spm=1001.2014.3001.55021.byte数组转BitmapImage常用的Byte数组转图像的方法如下:public......
  • Codeforces Round #828 (Div. 3) A~F
    A签到点击查看代码#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=2e5+10;intn;map<int,char>m;inta[N];chars[N];i......