首页 > 其他分享 >luogu6801题解

luogu6801题解

时间:2024-03-20 19:35:12浏览次数:25  
标签:题解 sum inv2 luogu6801 ans 矩形 ll MOD

本题解中不区别长度和宽度的区别,它们在本题解中指的是同一个东西。
本题解做法用到单调栈。

看这个特殊性质好像是让我们在高度上进行研究一下。

子任务 \(4\) 的特殊性质是想让你搞明白在一个矩形中如何计算其内部的矩形个数。

下面是一个 \(4\times 5\) 大小的矩形。

先来不考虑高度的影响,我们观察任一行的单位矩形,来统计该行的矩形。
这样的问题可以看成是一条线段让你截出若干个不同的线段,每个格子相当于一个点,我们统计合法的左右端点对数即可。
第 \(1\) 个格子作为左端点可以有第 \(1\),\(2\),\(\dots\),\(5\) 个格子作为右端点与其匹配。
第 \(2\) 个格子则有 \(2\),\(\dots\),\(5\)。
以此类推,设该行的长度为 \(w\),我们可以在该行中找出 \(\sum\limits_{i=1}^wi=\frac{w\times(w+1)}{2}\) 个矩形。
接着我们来考虑高度的影响,高度上与长度是独立的,设这个矩形的高为 \(h\),长度为 \(w\),容易发现这个矩形内有 \(\sum\limits_{i=1}^{w}i \times \sum\limits_{i=1}^{h}i=\frac{w\times(w+1)\times h\times (h+1)}{4}\)。

我们可以将这些矩形先看作一个整体,按照高度划分成若干的矩形进行统计。类似于下图。

这样我们维护一个单调栈,栈里面存放的是一个若干递增的矩形的整体,当遇到一个比栈中最高的矩形要矮的矩形时或最后的时候进行出栈统计。
这里的划分是指在维护过程中切掉突出的那一块,并将答案更新,使得最后的结果正确。
不可以只计算突出的部分内部的矩形个数,会少一些突出部分与下面一些部分结合的矩形。
可以采用容斥的方法计算,我这里把容斥剩余的部分给推了一下放代码里面,与直接容斥写法不同。

注意 long long 和取模的问题。

代码如下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int MAXN=1e5+10,MOD=1e9+7,inv2=500000004;
int n,h[MAXN],w[MAXN];
ll sum[MAXN],ans;
int s[MAXN],p;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&h[i]);//高度
    }
    for(int i=1;i<=n;++i){
        scanf("%d",&w[i]);//宽度
        sum[i]=sum[i-1]+w[i];
    }
    for(int i=1;i<=n;++i){
        while(p&&h[i]<h[s[p]]){
            if(h[s[p-1]]>=h[i]){
                ans=(ans+
                ((((((sum[i-1]-sum[s[p]-1])%MOD)*
                    ((sum[i-1]-sum[s[p]-1]+1)%MOD))%MOD)*inv2)%MOD)*
                (((((((ll)h[s[p]]-h[s[p-1]])%MOD)*
                    (((ll)h[s[p]]+h[s[p-1]]+1)%MOD))%MOD)*inv2)%MOD)%MOD
                )%MOD;
                --p;
            }
            else{
                ans=(ans+
                ((((((sum[i-1]-sum[s[p]-1])%MOD)*
                    ((sum[i-1]-sum[s[p]-1]+1)%MOD))%MOD)*inv2)%MOD)*
                (((((((ll)h[s[p]]-h[i])%MOD)*
                    (((ll)h[s[p]]+h[i]+1)%MOD))%MOD)*inv2)%MOD)%MOD
                )%MOD;
                h[s[p]]=h[i];
            }
        }
        if(!p||h[i]>h[s[p]]){s[++p]=i;}
    }
    while(p){
        ans=(ans+
            ((((((sum[n]-sum[s[p]-1])%MOD)*
                ((sum[n]-sum[s[p]-1]+1)%MOD))%MOD)*inv2)%MOD)*
            (((((((ll)h[s[p]]-h[s[p-1]])%MOD)*
                (((ll)h[s[p]]+h[s[p-1]]+1)%MOD))%MOD)*inv2)%MOD)%MOD
            )%MOD;
        --p;
    }
    printf("%lld\n",ans);
    return 0;
}

标签:题解,sum,inv2,luogu6801,ans,矩形,ll,MOD
From: https://www.cnblogs.com/LiJoQiao/p/18085908

相关文章

  • CF1091F 题解
    blog。提供线性做法,各方面完爆反悔贪心。先钦定能不飞就不飞,最后再分配盈余的能量。可能会在飞Lava的时候不够能量,只需要在前面来回移动,刷能量即可。由于Swim比Walk快,所以能Swim就全部用Swim刷能量,不能就Walk。最后是分配盈余能量。显然优先把Walk换成Fly,换一......
  • javascript:void(0);用法及常见问题解析
    javascript:void(0);是一个常见的JavaScript代码片段,通常用于在HTML中作为超链接的href属性值或者事件处理函数的返回值。下面是关于它的用法和常见问题的解析:用法:作为超链接的href属性值:<ahref="javascript:void(0);">点击这里</a>这样做的作用是让点击链......
  • Ubuntu E: 无法获得锁 /var/lib/dpkg/lock-frontend问题解决
    问题描述ubuntu18.04版本在更新出现:E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)即这个错误表明Ubuntu系统在尝试使用APT(高级包装工具)时无法获取一个锁文件。锁文件用于防止多个进程同时修改系统软件包数据库,以防止数据库损坏。错误信息中的“......
  • ARC174D Digit vs Square Root 题解
    ARC174DDigitvsSquareRoot题目大意给定\(N\),求有多少个正整数\(x(1\leqx\leqN)\)满足:在十进制表示下,\(\lfloorx\rfloor\)是\(x\)的前缀。Solve很难直接手推性质,考虑用如下程序打表:#include<bits/stdc++.h>#pragmaGCCoptimize(1,2,3,"Ofast","inline")usin......
  • 2024年3月18号题解
    DungeonMaster解题思路给格子编号,从1开始,这样我们就可以构建一个图对这个图跑迪杰斯特拉算法就可以得到我们需要的答案代码实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<limits.h>#defineuunsigned#......
  • USACO24OPEN Bessie's Interview S 题解
    题意简述:有\(n\)个奶牛,\(k\)个农夫,\(k\len\),每一个奶牛有一个面试时长\(t_i\),表示面试这个奶牛要多长时间。\(0\)时刻时对于所有的\(1\lei\lek\),第\(i\)个农夫会面试第\(i\)个奶牛,之后的面试顺序满足以下条件:若在某时刻\(t\),存在某个农夫已经面试完当前的奶牛,那......
  • abc176F题解
    abs176F题意:给定长度为\(3\timesn\),值域是\([1,n]\)的序列,不断下列操作直至序列剩余\(3\)个数:1.对序列最左侧\(5\)个数进行任意排列。2.取出序列最左侧\(3\)个数,如果\(3\)个数一样,则得分加一,然后删除这三个数。问最大得分为多少。思路:神仙dp题。首先有一个显然的\(\Thet......
  • codeforce Round 935 div3 个人题解(A-E)
    A.SettingupCamp时间限制:每个测试1秒内存限制:每个测试256兆字节输入:标准输入输出:标准输出组委会计划在游览结束后带领奥林匹克运动会的参赛选手进行徒步旅行。目前,正在计算需要搭帐篷的数量。已知每顶帐篷最多可容纳3人。在参赛选手中,有a个内向型,b个外向型和c个综合型:......
  • 20240319每日一题题解
    20240319每日一题题解Problem判断一个数的结构是否为某个数重复两遍得到。例如,\(123123\)是重复两遍的数,而\(333\),\(809680\)​则不是保证输入的数字不超过longlong型范围。若是,则输出yes;否则输出no。Solution从数字的角度要想解决这个问题也不是不可以,但是不如将给定的数......
  • 【蓝桥杯选拔赛真题70】python最短路径和 第十五届青少年组蓝桥杯python选拔赛真题 算
    目录python最短路径和一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python最短路径和第十五届蓝桥杯青少年组python比赛选拔赛真题一、题目要求(注:i......