51Nod 1562 玻璃切割 (set)
来源:互联网 发布:html转php 编辑:程序博客网 时间:2024/05/01 08:14
联动:CodeForces - 527C Glass Carving (二分+set) 多维矩形切割问题
是同一道题,51Nod 数据加强。
题意:
给出一个高为 H ,宽为 V 的矩形。要经过 N 次切割,问每次切割后最大的一块是多少?
思路:
首先注意乘积爆 INT 。
为简化思考,本题题意为二维切割,我们不妨先考虑将问题转化为一位线段的切割问题思考。
我们可以通过维护 切点 及 从每个切点开始的线段长度 得知每次操作后的最大长度。
即 利用 数组 维护从每个切点开始的线段长度
利用 set 维护 切点
利用 multiset 维护 所有线段的长度 以便求最大长度
在增加切点时利用 set 的二分查找和 multiset 的相关操作可以将效率压在 log(N)。
二维,多维同理
但是在 51 nod 仍是TLE 的。
于是进行了如下优化:
所有线段的长度 利用 set + 一个数组 维护,免去重复删除同样长度数据带来的多余的操作。
优化后仍有可能超时,但最多 100ms。
所以以下代码得看服务器心情 AC 。
代码:
#include <bits/stdc++.h>using namespace std;set<int> xset,yset;set<int> ansx,ansy;set<int>::iterator it1,it2;const int MAXN=200000+10;int xare[MAXN],yare[MAXN],opv[MAXN];char opc[MAXN];int main(){ int n,m,k,v,l,r; long long ans; char ch; while(scanf("%d %d %d",&n,&m,&k)!=-1){ getchar(); memset(xare,0,sizeof(xare)); memset(yare,0,sizeof(yare)); xset.clear();yset.clear();ansx.clear();ansy.clear(); xset.insert(0);xset.insert(n); yset.insert(0);yset.insert(m); ansx.insert(n),ansy.insert(m); xare[n]++;yare[m]++; for(int i=0;i<k;i++){ scanf("%c %d",&opc[i],&opv[i]);getchar(); } for(int i=0;i<k;i++){ ch=opc[i];v=opv[i]; if(ch=='V'){ it2=it1=xset.lower_bound(v); it1--; l=*it1; r=*it2; if(--xare[r-l]==0) ansx.erase(r-l); ansx.insert(v-l);ansx.insert(r-v);xset.insert(v); xare[v-l]++;xare[r-v]++; }else{ it2=it1=yset.lower_bound(v); it1--; l=*it1; r=*it2; if(--yare[r-l]==0) ansy.erase(r-l); ansy.insert(v-l);ansy.insert(r-v);yset.insert(v); yare[v-l]++;yare[r-v]++; } ans=*(--ansy.end()); ans*=*(--ansx.end()); printf("%lld\n",ans); } }}
现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要对他进行切割。
切割的方向有两种,横向和纵向。每一次切割之后就会有若干块玻璃被分成两块更小的玻璃。在切割之后玻璃不会被移动。
现在想知道每次切割之后面积最大的一块玻璃是多少。
样例解释:
对于第四次切割,下面四块玻璃的面积是一样大的。都是2。
单组测试数据。第一行有三个整数 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)。输入保证不会有两次切割是一样的。
对于每一次切割,输出所有玻璃中面积最大的是多少。
样例输入14 3 4H 2V 2V 3V 1
样例输出18442
- 51Nod 1562 玻璃切割 (set)
- 51nod 1562 玻璃切割 (set+离线处理)
- 51Nod-1562-玻璃切割
- 51Nod-1562-玻璃切割
- 51nod 1562 玻璃切割
- 51nod 1562 玻璃切割 【线段树】
- 51nod-1562:玻璃切割(O(n)模拟)
- 51nod 1562 玻璃切割(线段树区间合并)
- 51nod 1562玻璃切割(降维,反向处理)
- 51nod 1562 玻璃切割 (STL map+一点点的思考)
- 玻璃切割
- 51nod1562-模拟&好题&链表|线段树-玻璃切割
- 51nod 1280 前缀后缀集合(set)
- 51nod 1557 两个集合(Set)
- 51nod 1521 一维战舰【set】
- 51NOD算法马拉松 最大值问题 离线预处理+set lower_bound
- 51nod 1624-取余最长路(set+二分)
- 51nod 1460 连接小岛(贪心+set)
- 前端的几点认识
- 三所(第三研究所认证中心)使用Defensics测试硬件设备IPv6协议的可靠性
- LeetCode:Min Stack
- what dp其实是dfs(深搜)的简版
- python调用c接口
- 51Nod 1562 玻璃切割 (set)
- 基于ProtoBuf协议实现网络传输(三)
- AngularJs服务于自定义服务
- 使用jsoup爬取网站图片
- 多个指针指向一个对象
- jsp自定义标签
- Ubuntu(Linux)使用Eclipse搭建C/C++编译环境
- iOS项目打包成ipa文件
- Linux命令之cut