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的更多相关文章

  1. 【codeforces 527C】Glass Carving

    [题目链接]:http://codeforces.com/contest/527/problem/C [题意] 让你切割一个长方形; 只能横切或竖切; 让你实时输出切完之后最大的长方形的面积; [题解 ...

  2. CF # 296 C Glass Carving (并查集 或者 multiset)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  4. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  5. 「雅礼集训 2018 Day2」农民

    传送门 Description  「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...

  6. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  7. 「Mobile Testing Summit China 2016」 中国移动互联网测试大会-议题征集

    时至北京盛夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会正在紧锣密鼓的筹备中.只要你关注软件质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话 ...

  8. Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新

    当我们在 GitHub 上 fork 出一个仓库后,如果原仓库更新了,此时怎样才能保证我们 fork 出来的仓库和原仓库内容一致呢?我们一般关注的是仓库的 master(主干分支)的内容,通过以下步骤 ...

  9. 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(2)

    Lighting和Shading(2)镜面反射的控制和模拟次级表面散射技术 http://www.4gamer.net/games/216/G021678/20140703095/index_2.ht ...

  10. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

随机推荐

  1. Java(break、continue、label)

    1.break break在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) 例如:循环输出10 ...

  2. IM1281B电能计量模块_C语言例程

    一.前言 毕设采用了艾锐达公司的IM1281B电量计能模块,找了一圈没发现具体的51单片机的例程,现在写个能使用的C语言例程,方便以后的开发者们. 二.事前准备 引脚定义: 引脚 功能说明 V+ 供电 ...

  3. celery笔记三之task和task的调用

    本文首发于公众号:Hunter后端 原文链接:celery笔记三之task和task的调用 这一篇笔记介绍 task 和 task 的调用. 以下是本篇笔记目录: 基础的 task 定义方式 日志处理 ...

  4. Spark架构与运行流程

    1. 阐述Hadoop生态系统中,HDFS, MapReduce, Yarn, Hbase及Spark的相互关系. 2. Spark已打造出结构一体化.功能多样化的大数据生态系统,请简述Spark生态 ...

  5. 韩顺平Spring体系化笔记(内含ioc,aop,动态代理等底层原理)

    Spring Spring 核心学习内容 IOC.AOP. JdbcTemplate.声明式事务 1.Spring 几个重要概念 Spring 可以整合其他的框架(Spring 是管理框架的框架) S ...

  6. vivo 自研鲁班分布式 ID 服务实践

    作者:vivo IT 平台团队- An Peng 本文介绍了什么是分布式ID,分布式ID的业务场景以及9种分布式ID的实现方式,同时基于vivo内部IT的业务场景,介绍了自研鲁班分布式ID服务的实践. ...

  7. Sentieon | 每周文献-Genetic Disease-第二期

    遗传病系列文章-1 标题(英文):Answer ALS, a large-scale resource for sporadic and familial ALS combining clinical ...

  8. 自研ORM 子查询&嵌套查询

    作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer Oracle MySql Pos ...

  9. 【从0开始编写webserver·基础篇#03】TinyWeb源码阅读,还是得看看靠谱的项目

    [前言] 之前通过看书.看视频和博客拼凑了一个webserver,然后有一段时间没有继续整这个项目 现在在去看之前的代码,真的是相当之简陋,而且代码设计得很混乱,我认为没有必要继续在屎堆上修改了,于是 ...

  10. 分布式多协议接入网关FluxMQ-2.0功能说明

    FluxMQ-2.0版本更新内容 前言 FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台.FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟 ...