codeforces-Glass Carving(527C)std::set用法
2 seconds
256 megabytes
standard input
standard output
Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glass). He already has a rectangular wmm × h mm sheet of glass, a diamond glass cutter and lots of enthusiasm. What he lacks is understanding of what to carve and how.
In order not to waste time, he decided to practice the technique of carving. To do this, he makes vertical and horizontal cuts through the entire sheet. This process results in making smaller rectangular fragments of glass. Leonid does not move the newly made glass fragments. In particular, a cut divides each fragment of glass that it goes through into smaller fragments.
After each cut Leonid tries to determine what area the largest of the currently available glass fragments has. Since there appear more and more fragments, this question takes him more and more time and distracts him from the fascinating process.
Leonid offers to divide the labor — he will cut glass, and you will calculate the area of the maximum fragment after each cut. Do you agree?
The first line contains three integers w, h, n (2 ≤ w, h ≤ 200 000, 1 ≤ n ≤ 200 000).
Next n lines contain the descriptions of the cuts. Each description has the form H y or V x. In the first case Leonid makes the horizontal cut at the distance y millimeters (1 ≤ y ≤ h - 1) from the lower edge of the original sheet of glass. In the second case Leonid makes a vertical cut at distance x (1 ≤ x ≤ w - 1) millimeters from the left edge of the original sheet of glass. It is guaranteed that Leonid won't make two identical cuts.
After each cut print on a single line the area of the maximum available glass fragment in mm2.
4 3 4
H 2
V 2
V 3
V 1
8
4
4
2
7 6 5
H 4
V 3
V 5
H 2
V 1
28
16
12
6
4

题意:给出一个n*m的矩阵,然后按照要求切线,问每切一条线分割后的最大矩形面积是多少?
分析:开4个set关联容器,其中sh存的是垂直线上的子区间长度,sw存的是水平线上的子区间长度,qh存的是划分的高度上的切割点,qw存的是划分宽度上的切割点,然后每次加入一条直线,先从q里面找出它的左右相邻的点,把该区间分割,然后用s维护子区间长度,每次把水平线上最大的子区间长度和垂直线上的最大子区间长度相乘即可
#include"cstdio"
#include"cstring"
#include"cstdlib"
#include"cmath"
#include"string"
#include"map"
#include"cstring"
#include"algorithm"
#include"iostream"
#include"set"
#include"queue"
#include"stack"
#define inf 0x3f3f3f3f
#define M 200009
#define LL __int64
#define eps 1e-8
#define mod 1000000007
using namespace std;
int w[M],h[M];
int main()
{
int W,H,n;
while(scanf("%d%d%d",&W,&H,&n)!=-)
{
set<int>sw,sh;
set<int>qw,qh;
sw.clear();
sh.clear();
memset(w,,sizeof(w));
memset(h,,sizeof(h));
sw.insert(W);
sw.insert(-W);
sh.insert(H);
sh.insert(-H);
qw.insert();
qw.insert(W);
qw.insert(-W);
qh.insert();
qh.insert(H);
qh.insert(-H);
w[W]++;
h[H]++;
char ch[];
int x;
while(n--)
{
scanf("%s%d",ch,&x);
if(ch[]=='H')
{
qh.insert(x);
qh.insert(-x);
int r=*(qh.upper_bound(x));
int l=-*(qh.upper_bound(-x));
if(h[r-l])//记录该长度出现的次数
h[r-l]--;
if(!h[r-l])
{
sh.erase(r-l);
sh.erase(l-r);
} sh.insert(x-l);
h[x-l]++;
sh.insert(r-x);
h[r-x]++;
sh.insert(l-x);
sh.insert(x-r);
}
else
{
qw.insert(x);
qw.insert(-x);
int r=*(qw.upper_bound(x));
int l=-*(qw.upper_bound(-x));
if(w[r-l])
w[r-l]--;
if(!w[r-l])
{
sw.erase(r-l);
sw.erase(l-r);
} sw.insert(x-l);
w[x-l]++;
sw.insert(r-x);
w[r-x]++;
sw.insert(l-x);
sw.insert(x-r);
}
set<int>::iterator r1,r2;
r1=sh.begin();
r2=sw.begin();
printf("%I64d\n",(LL)(*r1)*(*r2));
}
}
return ;
}
#include"cstdio"
#include"cstring"
#include"cstdlib"
#include"cmath"
#include"string"
#include"map"
#include"cstring"
#include"algorithm"
#include"iostream"
#include"set"
#include"queue"
#include"stack"
#define inf 0x3f3f3f3f
#define M
#define LL __int64
#define eps 1e-8
#define mod
using namespace std;
int w[M],h[M];
int main()
{
int W,H,n;
while(scanf("%d%d%d",&W,&H,&n)!=-1)
{
set<int>sw,sh;
set<int>qw,qh;
sw.clear();
sh.clear();
memset(w,,sizeof(w));
memset(h,,sizeof(h));
sw.insert(W);
sw.insert(-W);
sh.insert(H);
sh.insert(-H);
qw.insert();
qw.insert(W);
qw.insert(-W);
qh.insert();
qh.insert(H);
qh.insert(-H);
w[W]++;
h[H]++;
char ch[];
int x;
while(n--)
{
scanf("%s%d",ch,&x);
if(ch[]=='H')
{
qh.insert(x);
qh.insert(-x);
int r=*(qh.upper_bound(x));
int l=-*(qh.upper_bound(-x));
if(h[r-l])//记录该长度出现的次数
h[r-l]--;
if(!h[r-l])
{
sh.erase(r-l);
sh.erase(l-r);
} sh.insert(x-l);
h[x-l]++;
sh.insert(r-x);
h[r-x]++;
sh.insert(l-x);
sh.insert(x-r);
}
else
{
qw.insert(x);
qw.insert(-x);
int r=*(qw.upper_bound(x));
int l=-*(qw.upper_bound(-x));
if(w[r-l])
w[r-l]--;
if(!w[r-l])
{
sw.erase(r-l);
sw.erase(l-r);
} sw.insert(x-l);
w[x-l]++;
sw.insert(r-x);
w[r-x]++;
sw.insert(l-x);
sw.insert(x-r);
}
set<int>::iterator r1,r2;
r1=sh.begin();
r2=sw.begin();
printf("%I64d\n",(LL)(*r1)*(*r2));
}
}
return ;
}
codeforces-Glass Carving(527C)std::set用法的更多相关文章
- Codeforces 527C Glass Carving
vjudge 上题目链接:Glass Carving 题目大意: 一块 w * h 的玻璃,对其进行 n 次切割,每次切割都是垂直或者水平的,输出每次切割后最大单块玻璃的面积: 用两个 set 存储每 ...
- Codeforces 527C Glass Carving(Set)
意甲冠军 片w*h玻璃 其n斯普利特倍 各事业部为垂直或水平 每个分割窗格区域的最大输出 用两个set存储每次分割的位置 就能够比較方便的把每次分割产生和消失的长宽存下来 每次分割后剩下 ...
- Glass Carving CodeForces - 527C (线段树)
C. Glass Carving time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...
- [codeforces 528]A. Glass Carving
[codeforces 528]A. Glass Carving 试题描述 Leonid wants to become a glass carver (the person who creates ...
- 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 ...
- codeforces 527 C Glass Carving
Glass Carving time limit per test 2 seconds Leonid wants to become a glass carver (the person who cr ...
- Codeforces Round #296 (Div. 1) A. Glass Carving Set的妙用
A. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CF #296 (Div. 1) A. Glass Carving 线段树
A. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 【CF527C】Glass Carving
[CF527C]Glass Carving 题面 洛谷 题解 因为横着切与纵切无关 所以开\(set\)维护横着的最大值和纵着的最大值即可 #include <iostream> #inc ...
随机推荐
- (转)Linux下安装Matlab2014及破解
原文链接:http://blog.csdn.net/lanbing510/article/details/41698285 文章已搬家至http://lanbing510.info/2014/12/0 ...
- java.util.concurrent.CopyOnWriteArrayList
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; impo ...
- setattribute兼容
var spanElement = document.getElementById("mySpan"); spanElement.style.cssText = "fon ...
- 权限管理:(RBAC)
一般做正规的权限管理程序基本就是以下M表模式: 例1:在页面显示管理者的权限,并可以修改的管理界面 数据库表如下: 管理界面(附ajax): <body> <?php include ...
- SDP协议译稿(Part 1)
本文的翻译内容是基于Bluetooth Core Spec 2.1+EDR 协议中对SDP的描述,很多都是个人的理解,难免有疏漏,有争议或者疑问的地方,欢迎在此留言进行探讨. 2. Overview ...
- maven--composer---setting.xml(updatepolicy)---mvn install , mvn deploy
场景:最近再整系统的自动部署流程,由于公司的jar包在svn以及mvn的仓库上都存在,开发人员在开发的过程中都依赖mvn仓库中的Jar 包,在jar上线的时候,配置管理人员把jar 从svn管理的工作 ...
- C#判断文件是复制还是剪切
private void button1_Click(object sender, EventArgs e){IDataObject vDataObject = Clipboard.GetDataOb ...
- angularJS中controller的通信
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- php-001-win7 环境下 wamp 的至简部署
此文主要记录学习 PHP 开发环境 wamp 的至简部署.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感激! 首先依据自身的操作系统选择,进入 wamp 的网站 :http://www.wamp ...
- FTP文件夹打开错误,Windows无法访问此文件夹
错误提示: Windows 无法访问此文件夹,请确保输入的文件夹是正确的,并且你有权访问此文件夹. 解决方法/步骤如下 1.请确保输入的文件夹是正确的,并且你有权访问此文件夹.可以在浏览器 ...