题解:P7306 [COCI2018-2019#1] Strah
分享一个
分析
考虑每次在
考虑如何统计一个
显然长度为
所以
用 deque
来记录 set
记录当前被占用的格子的位置。
每次移动 set
中,然后统计答案。
时间复杂度
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'; }
本文作者:Jimmy-LEEE
本文链接:https://www.cnblogs.com/redacted-area/p/18514173
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步