1562 玻璃切割

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1562

题目来源: CodeForces
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要对他进行切割。

切割的方向有两种,横向和纵向。每一次切割之后就会有若干块玻璃被分成两块更小的玻璃。在切割之后玻璃不会被移动。

现在想知道每次切割之后面积最大的一块玻璃是多少。

样例解释:

对于第四次切割,下面四块玻璃的面积是一样大的。都是2。

Input
单组测试数据。
第一行有三个整数 w,h,n (2≤w,h≤200000, 1≤n≤200000),表示玻璃在横向上长w 毫米,纵向上长h 毫米,接下来有n次的切割。
接下来有n行输入,每一行描述一次切割。
输入的格式是H y 或 V x。
H y表示横向切割,切割线距离下边缘y毫米(1≤y≤h-1)。
V x表示纵向切割,切割线距离左边缘x毫米(1≤x≤w-1)。
输入保证不会有两次切割是一样的。
Output
对于每一次切割,输出所有玻璃中面积最大的是多少。
Input示例
样例输入1
4 3 4
H 2
V 2
V 3
V 1
Output示例
样例输出1
8
4
4
2
对于每一行,记录它上一行和下一行的位置,以及它距离上一行的长度,列同理
由于所有的线都是直线,所以最大面积=最大行间距*最大列间距
为了减小复杂度,离线做,把最终的形态先弄出来,找到最大值,然后按相反的顺序删边,容易知道,如果删边会产生更大的玻璃,这块玻璃一定以删去的边为边,于是直接更新不需要其他操作。
最后别忘了用long long
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 200010
long long w,h,n,ans[maxn];
bool X[maxn],Y[maxn];
struct node{
char ch[];long long x;
}op[maxn];
struct Node{
long long pre,nxt,v;
}hang[maxn],lie[maxn];
int main(){
freopen("cola.txt","r",stdin);
scanf("%lld%lld%lld",&w,&h,&n);
X[]=X[h]=Y[]=Y[w]=;
for(long long i=;i<=n;i++){
scanf("%s%d",op[i].ch,&op[i].x);
if(op[i].ch[]=='H')X[op[i].x]=;
if(op[i].ch[]=='V')Y[op[i].x]=;
}
ans[]=w*h;
long long dx=,dy=;
for(long long i=,p=;i<=w;i++){
if(Y[i]==)
lie[i].pre=p,lie[p].nxt=i,lie[i].v=i-p,dy=max(dy,i-p),p=i;
}
lie[w].nxt=w;
for(long long i=,p=;i<=h;i++){
if(X[i]==)
hang[i].pre=p,hang[p].nxt=i,hang[i].v=i-p,dx=max(dx,i-p),p=i;
}
hang[h].nxt=h;
ans[n]=dx*dy;
for(long long i=n;i>=;i--){
if(op[i].ch[]=='H'){
long long u=op[i].x;
hang[hang[u].nxt].v+=hang[u].v;
hang[hang[u].pre].nxt=hang[u].nxt;
hang[hang[u].nxt].pre=hang[u].pre;
dx=max(dx,hang[hang[u].nxt].v);
}
else{
long long u=op[i].x;
lie[lie[u].nxt].v+=lie[u].v;
lie[lie[u].pre].nxt=lie[u].nxt;
lie[lie[u].nxt].pre=lie[u].pre;
dy=max(dy,lie[lie[u].nxt].v);
}
ans[i-]=dx*dy;
}
for(long long i=;i<=n;i++){
printf("%lld\n",ans[i]);
}
}

51nod 1562 玻璃切割的更多相关文章

  1. 51nod 1562 玻璃切割 (STL map+一点点的思考)

    1562 玻璃切割 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要 ...

  2. 51nod 1562 玻璃切割 (set)

    #include<stdio.h> #include<iostream> #include<set> using namespace std; typedef lo ...

  3. AC日记——玻璃切割 51nod 1562

    玻璃切割 思路: 并查集: 离线操作: 先把每次切割都存下来: 然后从后面不断合并切割: 然后每次更新最大长和宽: 记录答案: 要开longlong: 来,上代码 #include <cstdi ...

  4. GFF 和 OGS 这两种触摸屏谁更好?

    我将从成本分析.制程分析.用户体验三个方面来回答楼主的问题.GFF的触摸屏从字面上翻译过来,就是一层玻璃cover,两层film构成的触摸屏.其中,玻璃cover作为整个手机的coverlens,从外 ...

  5. 51nod 1117 聪明的木匠 (贪心)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1117 跟挑战程序书上例题一样,将要切割的n断木板,分别对应二叉树树的叶子 ...

  6. 51nod 1117 贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1117 1117 聪明的木匠 题目来源: 河北大学算法艺术协会 基准时间限 ...

  7. PHP搭建大文件切割分块上传功能

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...

  8. 任意多边形切割/裁剪(附C#代码实现)

    本实现主要参考了发表于2003年<软件学报>的<一个有效的多边形裁剪算法>(刘勇奎,高云,黄有群)这篇论文,所使用的理论与算法大都基于本文,对论文中部分阐述进行了详细解释,并提 ...

  9. Nginx 访问日志轮询切割

    Nginx 访问日志轮询切割脚本 #!/bin/sh Dateformat=`date +%Y%m%d` Basedir="/application/nginx" Nginxlog ...

随机推荐

  1. pinpoint本地开发-web模块

    web模块中的前端依赖会导致工程很难打包成功,对于这些,我们可以直接注释掉 比如: <plugin> <groupId>com.github.eirslett</grou ...

  2. 2017SN多校D1T2 note:dp

    题意: 给你一个长度为n的字符串s,并且告诉你有m对字母不能相邻,问你最少在s中取出多少个字符能够使这个字符串合法. 题解: 表示状态: dp[i] = max num of letters 考虑到第 ...

  3. mysql密码过期的修改方法(your password has expired)

    今天打开SQLyog提示密码过期:Your password has expired 解决方法:    1.  启动MySQL服务 2.  启动MySQL后台 3.  执行以下命令 step 1: S ...

  4. Ajax处理后台返回的Json数据

    // 处理后台传来的Json字符串装换成Json对象 var dataJson = JSON.parse(data); // 此时可以从Json对象中取值 if(dataJson.result == ...

  5. 局域网扫描IP

    今天有朋友去面试,被问到一个“如何扫描局域网IP”的问题(即找出局域网中当前已使用的IP),朋友回答的不好,回来问我,我首先想到的就是使用ping命令将局域网可分配的IP地址逐个遍历一遍,能ping通 ...

  6. tyvj1015公路乘车——DP

    题目:http://www.joyoi.cn/problem/tyvj-1015 代码如下: #include<iostream> #include<cstdio> using ...

  7. POJ1860(ford判环)

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24243   Accepted: 881 ...

  8. 【转】Pro Android学习笔记(九):了解Content Provider(下下)

    Content provider作为信息的读出,比较常见的还有文件的读写,最基础的就是二进制文件的的读写,例如img文件,音频文件的读写.在数据库中存放了该文件的路径,我们可以通过ContentPro ...

  9. Java面试知识点总结(1)

    1.Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? 原始数据类型 大小(byte) 对应封装类型 boolean 1或4 Boolean byte 1 Byte short 2 S ...

  10. Pointer 指针

    利用指针访问对象,指针指向一个对象,允许使用解引用符(操作符*)来访问对象 int ival = 42; int *p = &ival;//p存放变量ival的内存地址,p是指向变量ival的 ...