首页 > 其他分享 >题解:P7306 [COCI2018-2019#1] Strah

题解:P7306 [COCI2018-2019#1] Strah

时间:2024-10-29 19:02:20浏览次数:5  
标签:right frac int 题解 sum 2019 端点 Strah left

分享一个 \(O(nm\log m)\) 的方法。

分析

考虑每次在 \(x\) 轴上固定左端点,然后移动 \(x\) 轴上的右端点,并统计答案。

考虑如何统计一个 \(1\times n\) 的区域的贡献。

显然长度为 \(i\) 的区间有 \(n-i+1\) 个,所以贡献即为:

\[\begin{aligned} f(n)=&\sum^n_{i=1} i\left(n-i+1\right) \\ =&\sum^n_{i=1} \left(n+1\right)i-i^2 \\ =&\left(\left(n+1\right)\sum^n_{i=1} i\right)-\left(\sum^n_{i=1} i^2\right) \\ =&\left(\left(n+1\right)\frac{n\left(n+1\right)}{2}\right)-\frac{n\left(n+1\right)\left(2n+1\right)}{6} \\ =&\frac{n\left(n+1\right)^2}{2}-\frac{n\left(n+1\right)\left(2n+1\right)}{6} \\ =&\frac{n\left(n+1\right)\left(n+2\right)}{6} \\ \end{aligned} \]

所以 \(x\) 轴左端点为 \(l\),右端点为 \(r\),高度为 \(h\) 的矩形区域的贡献为 \((r-l+1)\cdot f(h)\)。

用 \(m\) 个 deque 来记录 \(y=m\) 的不适宜种植的格子的位置,再用一个 set 记录当前被占用的格子的位置。

每次移动 \(r\) 都先将 \(x=r\) 的不适宜种植的格子加入 set 中,然后统计答案。

时间复杂度 \(O(nm\log m)\)。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 2003

deque<int> lx[maxn];

int64_t f(int64_t n) {return n*(n+1)*(n+2)/6;}
string str;
set<int> s;
vector<int> dts[maxn];

int main()
{
    int n, m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>str;
        for(int j=1;j<=m;j++)
            if(str[j-1]=='#') lx[j].emplace_back(i);
    }
    int64_t ans=0;
    for(int i=1;i<=m;i++) lx[i].emplace_back(n+1);
    for(int l=1;l<=n;l++)
    {
        s.clear();
        s.emplace(0);
        s.emplace(m+1);
        int64_t sum=f(m);
        for(int i=l;i<=n;i++) dts[i].clear();
        for(int i=1;i<=m;i++) 
            if(lx[i].front()==l-1) lx[i].pop_front();
        for(int i=1;i<=m;i++) 
            dts[lx[i].front()].emplace_back(i);
        for(int r=l;r<=n;r++)
        {
            for(auto p:dts[r])
            {
                auto nxt=s.lower_bound(p);
                auto pre=prev(nxt);
                sum-=f(*nxt-*pre-1);
                sum+=f(*nxt-p-1);
                sum+=f(p-*pre-1);
                s.emplace(p);
            }
            ans+=sum*(r-l+1);
        }
    }
    cout<<ans<<'\n';
}

标签:right,frac,int,题解,sum,2019,端点,Strah,left
From: https://www.cnblogs.com/redacted-area/p/18514173

相关文章

  • 题解:P8245 [COCI2013-2014#3] PAROVI
    题意定义两个整数\(A,B\)之间的距离为这两个整数所有对应位上的数的差的绝对值之和,记为\(\operatorname{dist}(A,B)\)。特别地,如果\(A,B\)两数的位数不相同,则在位数较小的数前补足前导\(0\)。现在,给定两个整数\(L,R\),请你求出所有在区间\([L,R]\)内的整数对的距离和。......
  • [GXYCTF 2019]Ping Ping Ping 题解(多种解题方式)
    知识点:命令执行linux空格绕过反引号绕过      变量绕过         base64编码绕过打开页面提示"听说php可以执行系统函数?我来康康"然后输入框内提示输入bjut.edu.cn  输入之后回显信息,是ping这个网址的信息 输入127.0.0.1因为提示是命令......
  • Educational Codeforces Round 171 (Rated for Div. 2) 题解(A-C)
    EducationalCodeforcesRound171(RatedforDiv.2)题解(A-C)这场ABC全都犯病了(悲伤)目录EducationalCodeforcesRound171(RatedforDiv.2)题解(A-C)目录A.PerpendicularSegmentsB.BlackCellsC.ActionFiguresA.PerpendicularSegments大意给你一个......
  • [CodeForces] CF520 题解
    A.Pangram【题目大意】给定一个字符串,询问是否所有英文字符(a到z)都在这个字符串中出现过,不区分大小写。【解题思路】开个桶记录字符是否出现过,最后遍历桶,如果发现有一个没出现就输出NO,否则就输出YES。注意不区分大小写!B.TwoButtons【题目大意】给定两个正整数\(n\)......
  • Educational Codeforces Round 171 (Rated for Div. 2)题解记录
    比赛链接:https://codeforces.com/contest/2026A.PerpendicularSegments题目说了必定有答案,直接对角线即可#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<deque>#include<......
  • [ARC186E] Missing Subsequence 题解
    Description给定一个整数序列\(\left(X_1,\ldots,X_M\right)\),其长度为\(M\),元素取值为\(1,\ldots,K\)。要求找出长度为\(N\)的序列\((A_1,\ldots,A_N)\)的数量,元素取值为\(1,\ldots,K\),并满足以下条件,结果取模\(998244353\):在所有长度为\(M\)的序列中,唯......
  • ybtoj题解索引
    密码:sunxuhetai2009第一章-递推算法A.错排问题B.传球游戏C.数的划分D.栈的问题E.求f函数F.划分数列G.无限序列......
  • C#的vs2019项目打包安装程序exe
    C#的vs2019项目打包安装程序exe1.在扩展插中安装插件在Nget包管理器中搜索如下名字的插件MicrosoftVisualStudioInstallProjects点击安装后重启vs20192.创建SetupProject项目完成安装后点击项目中新建项,创建SetupProject的项目创建完成后点击图中步骤添加文件,将你......
  • 题解:P3352 [ZJOI2016] 线段树
    首先,题目上说让期望乘上\((\frac{n(n+1)}{2})^q\)的目的就是让我们求方案数与值的乘积。然后我们考虑在操作过后一个位置上的值相对于原来的值肯定是不降的,于是可以想到对每一个值\(v\),原序列中所有\(\lev\)的元素一定构成了若干连续的区间。对每一个这样的区间而言,操作过......
  • P6803 星际迷航 题解
    P6803星际迷航题解题目大意给定一颗\(N\)个节点的树。这样的树有\(D+1\)层,编号从\(0\)到\(D\)。对于\(i=0,1,\dots,D-1\),需要选择第\(i\)层的任意一个节点向第\(i+1\)层的任意一个节点连一条有向边。最初人在第\(0\)层图的\(1\)号节点。两个玩家交替选择下一......