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 ...
随机推荐
- java 客户端获取真实ip地址
在开发工作中,我们常常需要获取客户端的IP.一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...
- duplicate symbol _OBJC_CLASS 错误处理方法
错误: ld: duplicate symbol _OBJC_CLASS_$_************ in **************** 一种可能性是你的项目的不同group里有着相同名称的类 ...
- SQL Server批量数据导出导入BCP使用
BCP简介 bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.bcp可以将数据库的表或视图直接导出,也能通过 ...
- zepto源码--qsa--学习笔记
zepto内部选择器qsa方法的实现. 简述实现原理: 通过判断传入的参数类型: 如果是'#id',则使用getElementById(id)来获取元素,并且将结果包装成数组形式: 如果是'.clas ...
- 设计模式:建造者模式(Builder)
定 义:将一个复杂对象的构建与它的表示分离,使得同一构建过程可以创建不同的表示. 结构图: 产品类: class Product { //部件集合 List<string> parts ...
- magento多语言中文语言包
语言包key:http://connect20.magentocommerce.com/community/Mage_Locale_zh_CN
- Face The Right Way---hdu3276(开关问题)
题目链接:http://poj.org/problem?id=3276 题意:n牛头排成一排,每头牛两个状态,向前或向后,为了让所有的牛都向前,现在有一个机器 每次 能控制连续K头牛转换自己的状态,求 ...
- SSH验证原理
http://www.tuicool.com/articles/qyiyim 下面会讲解ssh的密码登陆和免密码登陆.无论是密码登陆还是免密码登陆,安全使用的都是RSA非对称加密. SSH之所以能够保 ...
- MSP430之ADC采集滤波
占位符 /* 加权平均滤波 */ ] = {,,,,,,,,,,,,}; ++++++++++++; unsigned ; ; i<ADCN; i++) { temp += arr[i]*coe ...
- MVC强类型和弱类型的区别
1 强类型的处理 首先必须要有一个对象的实体类,UserINfo就是一个实体类,如下: public class UserInfo() { public int Id{set;get;} publi ...