vjudge 上题目链接:Glass Carving

  题目大意: 一块 w * h 的玻璃,对其进行 n 次切割,每次切割都是垂直或者水平的,输出每次切割后最大单块玻璃的面积:

  

  用两个 set 存储每次切割的位置,就可以比较方便的把每次切割产生和消失的长宽存下来(用个 hash 映射数组记录下对应值的长宽的数量即可,O(1) 时间维护),每次切割后剩下的最大长宽的积就是答案了:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<set>
 5 using namespace std;
 6 typedef long long LL;
 7 const int N = 200005;
 8
 9 int w[N], h[N];    // 记录存在的边长的数量
10 set<int> sw, sh;    // 记录下所有切点的位置
11 set<int>::iterator i,j;
12
13 void insert(set<int> &s, int *b, int p) {
14     s.insert(p);
15     i = j = s.find(p);
16     ++j;   --i;
17     --b[*j - *i];    // 除掉被分开的长宽
18     ++b[p - *i];    // 新产生了两个长宽
19     ++b[*j - p];
20 }
21
22 int main() {
23     int ww,hh,n,p;
24     while(~scanf("%d %d %d",&ww,&hh,&n)) {
25         sw.clear();   sh.clear();
26         sw.insert(0);    sw.insert(ww);
27         sh.insert(0);    sh.insert(hh);
28
29         memset(w, 0, sizeof w);     w[ww]++;
30         memset(h, 0, sizeof h);     h[hh]++;
31         int y = ww, x = hh;
32
33         while(n--) {
34             getchar();
35             if(getchar() == 'H') {
36                 scanf("%d",&p);
37                 insert(sh, h, p);
38             }
39             else {
40                 scanf("%d",&p);
41                 insert(sw, w, p);
42             }
43             while(!w[y])    --y;    // 因为每次切割后最大值总是单调递减的,所以这样维护即可,如果从头到尾扫一遍的话会超时的
44             while(!h[x])    --x;
45             printf("%I64d\n", (LL)x * y);
46         }
47     }
48     return 0;
49 }

  参考了别人的思路才会做的,果然好强大,自己也好弱 Orz 。。。

转载于:https://www.cnblogs.com/Newdawn/p/4818537.html

Codeforces 527C Glass Carving相关推荐

  1. Codeforces 527C Glass Carving (最长连续0变形+线段树)

    Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glas ...

  2. Codeforces 528A Glass Carving STL模拟

    题目链接:点击打开链接 题意: 给定n*m的矩阵.k个操作 2种操作: 1.H x 横向在x位置切一刀 2.V y 竖直在y位置切一刀 每次操作后输出最大的矩阵面积 思路: 由于行列是不相干的,所以仅 ...

  3. Codeforces Round #296 (Div. 2) C. Glass Carving [ set+multiset ]

    传送门 C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  4. 【CodeForces - 527C】Glass Carving(线段树或者SBT或者set)

    题干: Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the ...

  5. CodeForces - 1459D Glass Half Spilled(dp)

    题目链接:点击查看 题目大意:给出 n 个水杯,每个水杯最大容量为 aia_iai​,每个水杯初始时有 bib_ibi​ 的水,两个水杯之间可以互相倒水,不过每次会损失一半水量,更具体的说,假设第 i ...

  6. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  7. 【转载】线段树题目2

    1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...

  8. Linux java集成安装环境,Linux下Java环境安装

    本节主要讲解Linux(Centos 6.5)下Java环境的安装 1. 卸载机器上默认安装的JDK 在Linux环境下一般会默认安装jdk,为了自己项目的开发部署,一般情况要重新装jdk,而且自己装 ...

  9. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

最新文章

  1. 【组队学习】【35期】数据可视化(Matplotlib)
  2. 铜川市计算机学校排名,铜川市计算机专业学校
  3. Spring in Action 4th 学习笔记 之 AOP
  4. 【Groovy】集合遍历 ( “ *. “ 展开操作符 | 代码示例 )
  5. 手把手教你在Linux上搭建BitTorrent服务器
  6. 电脑服务器不稳定怎么办,网速不稳定怎么办? 网速不稳定的原因与解决办法-电脑教程...
  7. Geth的命令行介绍
  8. qt tableWidget 表格控件使用
  9. 优化--减少HTTP请求
  10. 【Python CheckiO 题解】Even the Last
  11. 想成为有钱人,你要逼自己戒掉这5个坏习惯
  12. hbase 导入到es_HBase数据同步到ElasticSearch的方案
  13. python中的列表推导与生成器
  14. java编程练习题三
  15. 架构设计 - 架构师必读书单
  16. 达朴汇联CEO张焱:从隐私计算出发,共建Web3.0
  17. Java 汉字获取拼音或首字母工具类
  18. html外链自动加nofollow,WordPress自动为站外链接添加nofollow标签
  19. 伦敦国王学院计算机申请要求,2020年伦敦国王学院高级计算机专业研究生申请条件及世界排名|学费介绍...
  20. python 两个等长list的各对应位置元素相加+两个字典相加,相同键元素累加,不同键元素取全集

热门文章

  1. git在跟踪bug中的使用
  2. 【转载】FAT32文件系统详解
  3. 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
  4. Android快速开发不可或缺的11个工具类(下载)
  5. Stop Googling!
  6. 中国招商银行设计严重缺陷
  7. [恢]hdu 1421
  8. 常用的对象处理工具类
  9. python代码加密cython_利用Cython加密python脚本
  10. layui引入php项目,怎么将layui引入开发框架中