Solution -「营业」「CF 527C」Glass Carving
Description
Link.
有一个块 \(n\times m\) 的矩形,有 \(q\) 次操作,每次把矩形横 / 竖着切一刀,问切完后的最大矩形面积。
Solution
一个不同于大多数人、总时间复杂度 \(\mathcal{O}(n\log_{2}n)\),每次回答 \(\mathcal{O}(\alpha(n))\) 的做法,瓶颈在排序。
显然答案是最大行列相乘。首先我们把询问离线,然后逆序处理。你发现这相当于把切开变成了合并,最大值不降,于是可以直接维护。
具体来说就是维护两个并查集,分别是行和列,然后再维护集合内元素个数,然后就直接合并。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read() {
ll x=0,f=0;
char ch=getchar();
while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+(ch&15),ch=getchar();
return f?-x:x;
}
const int N=200100;
signed main() {
int m=read(),n=read(),q=read();
static int far[N],fac[N],szr[N],szc[N];
iota(far+1,far+m+1,1);
iota(fac+1,fac+n+1,1);
for(int i=1;i<=m;++i) szr[i]=1;
for(int i=1;i<=n;++i) szc[i]=1;
auto findr=[&](int x) {while(x!=far[x]) x=far[x]=far[far[x]]; return x;};
auto findc=[&](int x) {while(x!=fac[x]) x=fac[x]=fac[fac[x]]; return x;};
auto merger=[&](int x,int y) {x=findr(x),y=findr(y); (x!=y)&&(szr[y]+=szr[x],szr[x]=0,far[x]=y);};
auto mergec=[&](int x,int y) {x=findc(x),y=findc(y); (x!=y)&&(szc[y]+=szc[x],szc[x]=0,fac[x]=y);};
static int op[N],X[N];
vector<int> hx,vx;
for(int i=1; i<=q; ++i) {
char Op[4];
scanf("%s",Op);
op[i]=Op[0]=='H';
X[i]=read();
(op[i])&&(X[i]=n-X[i]);
(op[i])&&(hx.push_back(X[i]),1);
(!op[i])&&(vx.push_back(X[i]),1);
}
sort(hx.begin(),hx.end());
sort(vx.begin(),vx.end());
hx.insert(hx.begin(),0);
vx.insert(vx.begin(),0);
hx.push_back(n);
vx.push_back(m);
for(unsigned int i=1; i<hx.size(); ++i)
for(int j=hx[i-1]+2; j<=hx[i]; ++j) mergec(j-1,j);
for(unsigned int i=1; i<vx.size(); ++i)
for(int j=vx[i-1]+2; j<=vx[i]; ++j) merger(j-1,j);
ll mxr=0,mxc=0;
for(int i=1; i<=m; ++i) mxr=max(mxr,(ll)szr[findr(i)]);
for(int i=1; i<=n; ++i) mxc=max(mxc,(ll)szc[findc(i)]);
vector<ll> ans;
ans.push_back(mxr*mxc);
for(int i=q; i>1; --i) {
if(op[i]) mergec(X[i]+1,X[i]),mxc=max(mxc,(ll)szc[findc(X[i])]);
else merger(X[i],X[i]+1),mxr=max(mxr,(ll)szr[findr(X[i])]);
ans.push_back(mxr*mxc);
}
reverse(ans.begin(),ans.end());
for(ll x:ans) printf("%lld\n",x);
return 0;
}
Solution -「营业」「CF 527C」Glass Carving的更多相关文章
- 【codeforces 527C】Glass Carving
[题目链接]:http://codeforces.com/contest/527/problem/C [题意] 让你切割一个长方形; 只能横切或竖切; 让你实时输出切完之后最大的长方形的面积; [题解 ...
- CF # 296 C Glass Carving (并查集 或者 multiset)
C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- 「雅礼集训 2018 Day2」农民
传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「Mobile Testing Summit China 2016」 中国移动互联网测试大会-议题征集
时至北京盛夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会正在紧锣密鼓的筹备中.只要你关注软件质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话 ...
- Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新
当我们在 GitHub 上 fork 出一个仓库后,如果原仓库更新了,此时怎样才能保证我们 fork 出来的仓库和原仓库内容一致呢?我们一般关注的是仓库的 master(主干分支)的内容,通过以下步骤 ...
- 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(2)
Lighting和Shading(2)镜面反射的控制和模拟次级表面散射技术 http://www.4gamer.net/games/216/G021678/20140703095/index_2.ht ...
- 「Windows MFC 」「Edit Control」 控件
「Windows MFC 」「Edit Control」 控件
随机推荐
- ARC142
ARC142 考试情况:一眼订正,鉴定为做出前三题. A - Reverse and Minimize 分析题目性质可得三种情况: \(K\) 末尾有 \(0\) 最多只有 \(K\) 本身一个答案. ...
- R 语言 download.file 的几点知识
R 语言中,不管是安装包,还是下载数据,很多时候都会用到download.file这个函数.如果你在安装包或者下载数据过程中出现中断,或者异常,想要判断是远程源服务器的问题,还是自身服务器的问题,还是 ...
- 【C#/.NET】record介绍
目录 什么是record? 使用record record解构 record原理 结论 什么是record? record是.NET 5中的一种新特性,可以看作是一种概念上不可变的类.recor ...
- 【Python&GIS】GDAL栅格转面&计算矢量面积
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式.它 ...
- Centos7安装配置Hive
Centos7安装配置 一 . 安装 安装就不多做详述,选择好自己的镜像设置好路径即可 二 .配置 2.1 网络配置 桌面右键进入 cmd 命令编辑窗口,在 Linux 中设置网络的相关配置都需要管理 ...
- 一张图快速了解 Istio 的 EnvoyFilter
EnvoyFilter简介 EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置.使用 EnvoyFilter 修改某些字段的值,添加特定的过滤器,甚至添加全 ...
- Rust函数参数传递的一个观点
Q5: 一个函数的观点A5: Rust中的每个函数都是自治的,在每一个函数体中,相当于重新开辟了一个新的领域.将参数传递给函数参数,与let声明一个绑定是一样的规则. 1 ``` 2 // 所有权语义 ...
- VSCode中打开NodeJS项目自动切换对应版本的配置
这几年搞了不少静态站点,有的是Hexo的,有的是VuePress的.由于不同的主题对于NodeJS的版本要求不同,所以本机上不少NodeJS的版本. 关于如何管理多个NodeJS版本,很早之前就写过用 ...
- 【Jenkins】 GitLab Gitee GitHub 部署
Jenkins GitLab Gitee GitHub 部署 环境 Jenkins Git Maven Jenkins 部署可参考文章:https://www.cnblogs.com/cxt618/p ...
- Maven配置UTF8,JDK版本
<!-- 局部jdk配置,pom.xml中 --> <build> <plugins> <plugin> <groupId>org.apac ...