CF #296 (Div. 1) A. Glass Carving 线段树
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
Picture for the first sample test:
Picture for the second sample test:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
using namespace std; #define N 200005
#define ll root<<1
#define rr root<<1|1
#define mid1 (a[root].l+a[root].r)/2
#define mid2 (b[root].l+b[root].r)/2 int w, h, n;
struct node{
int l, r;
int lx, rx;
int maxh;
}a[N*], b[N*]; void build1(int l,int r,int root){
a[root].l=l;
a[root].r=r;
if(l==r){
if(l==) a[root].lx=a[root].rx=;
else if(l==w) a[root].lx=a[root].rx=w;
else a[root].lx=a[root].rx=-;
a[root].maxh=;
return;
}
build1(l,mid1,ll);
build1(mid1+,r,rr);
a[root].lx=a[ll].lx;
a[root].rx=a[rr].rx;
a[root].maxh=a[root].r-a[root].l;
} void build2(int l,int r,int root){
b[root].l=l;
b[root].r=r;
if(l==r){
if(l==) b[root].lx=b[root].rx=;
else if(l==h) b[root].lx=b[root].rx=h;
else b[root].lx=b[root].rx=-;
b[root].maxh=;
return;
}
build2(l,mid2,ll);
build2(mid2+,r,rr);
b[root].lx=b[ll].lx;
b[root].rx=b[rr].rx;
b[root].maxh=b[root].r-b[root].l;
} void update1(int p,int root){
if(a[root].l==p&&a[root].r==p){
a[root].lx=a[root].rx=p;return;
}
if(p<=a[ll].r) update1(p,ll);
else update1(p,rr);
int ln, rn;
if(a[ll].lx!=-) a[root].lx=a[ll].lx;
else if(a[ll].rx!=-) a[root].lx=a[ll].rx;
else if(a[rr].lx!=-) a[root].lx=a[rr].lx;
else if(a[rr].rx!=-) a[root].lx=a[rr].rx;
else a[root].lx=-; if(a[rr].rx!=-) a[root].rx=a[rr].rx;
else if(a[rr].lx!=-) a[root].rx=a[rr].lx;
else if(a[ll].rx!=-) a[root].rx=a[ll].rx;
else if(a[ll].lx!=-) a[root].rx=a[ll].lx;
else a[root].rx=-; if(a[ll].rx!=-) ln=a[ll].r-a[ll].rx;
else ln=a[ll].r-a[ll].l;
if(a[rr].lx!=-) rn=a[rr].lx-a[rr].l;
else rn=a[rr].r-a[rr].l; a[root].maxh=max(max(a[ll].maxh,a[rr].maxh),ln+rn+);
} void update2(int p,int root){
if(b[root].l==p&&b[root].r==p){
b[root].lx=b[root].rx=p;return;
}
if(p<=b[ll].r) update2(p,ll);
else update2(p,rr);
int ln, rn;
if(b[ll].lx!=-) b[root].lx=b[ll].lx;
else if(b[ll].rx!=-) b[root].lx=b[ll].rx;
else if(b[rr].lx!=-) b[root].lx=b[rr].lx;
else if(b[rr].rx!=-) b[root].lx=b[rr].rx;
else b[root].lx=-; if(b[rr].rx!=-) b[root].rx=b[rr].rx;
else if(b[rr].lx!=-) b[root].rx=b[rr].lx;
else if(b[ll].rx!=-) b[root].rx=b[ll].rx;
else if(b[ll].lx!=-) b[root].rx=b[ll].lx;
else b[root].rx=-;
if(b[ll].rx!=-) ln=b[ll].r-b[ll].rx;
else ln=b[ll].r-b[ll].l;
if(b[rr].lx!=-) rn=b[rr].lx-b[rr].l;
else rn=b[rr].r-b[rr].l;
b[root].maxh=max(max(b[ll].maxh,b[rr].maxh),ln+rn+);
} main()
{
int i, j, k;
while(scanf("%d %d %d",&w,&h,&n)==){
char s[];
build1(,w,);
build2(,h,);
// printf("%d %d\n",a[1].maxh,b[1].maxh);
while(n--){
scanf("%s%d",s,&k);
if(s[]=='H'){
update2(k,);
}
else{
update1(k,);
}
// printf("%d %d\n",a[1].maxh,b[1].maxh);
printf("%I64d\n",(__int64)a[].maxh*(__int64)b[].maxh);
}
}
}
CF #296 (Div. 1) A. Glass Carving 线段树的更多相关文章
- 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 ...
- 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 ...
- CF 552(div 3) E Two Teams 线段树,模拟链表
题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...
- [Codeforces Round #296 div2 D] Clique Problem 【线段树+DP】
题目链接:CF - R296 - d2 - D 题目大意 一个特殊的图,一些数轴上的点,每个点有一个坐标 X,有一个权值 W,两点 (i, j) 之间有边当且仅当 |Xi - Xj| >= Wi ...
- CF 666E Forensic Examination 【SAM 倍增 线段树合并】
CF 666E Forensic Examination 题意: 给出一个串\(s\)和\(n\)个串\(t_i\),\(q\)次询问,每次询问串\(s\)的子串\(s[p_l:p_r]\)在串\(t ...
- Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并
D. Developing Game Pavel is going to make a game of his dream. However, he knows that he can't mak ...
- Codeforces Round #275 Div.1 B Interesting Array --线段树
题意: 构造一个序列,满足m个形如:[l,r,c] 的条件. [l,r,c]表示[l,r]中的元素按位与(&)的和为c. 解法: 线段树维护,sum[rt]表示要满足到现在为止的条件时该子树的 ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
- Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq
B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...
随机推荐
- 18-ES6(1)
第18课-ES6(1) 模块化 1.export和import // model.js export default let m = 1; // 出错 export default n = 2; le ...
- Canvas 与 Paint 类的 使用
使用canvas画布和paint画笔可以自定义view 案例:fastindexbar 基本用法 public class DrawView extends View{ private Rect mR ...
- 并查集 poj2236
网址:http://poj.org/problem?id=2236 题意:有n台坏的电脑,如果每两台电脑的距离不能超过d,那么这两台电脑有联系,用字符串O 表示标记第x台电脑维修了,用S判断从X到y是 ...
- Less环境搭建
1.在页面中加入 .less 样式表的链接,并将 rel 属性设置为 "stylesheet/less": <link rel="stylesheet/less&q ...
- Ajax --- 数据请求
下面主要介绍(JS原生)数据请求的主要步骤: Ajax 数据请求步骤: 1.创建XMLHttpRequest对象 2.准备数据发送 3.执行发送 4.指定回掉函数 第一步:创建XMLHttpReque ...
- ichart.js绘制虚线 ,平均分虚线
var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元"," ...
- 淘宝网触屏版 - 学习笔记(0 - 关于dpr)
注:本文是学习笔记,并不是教程,所以会有很多我不理解或猜测的问题,也会有不尽详实之处,望见谅. 对于pc端网页设计师来说,移动端的网页制作,我之前只是简单的加了一个 <meta name=&qu ...
- Spire.Office组件使用例子
用.NET开发程序通常要涉及到对Office文件读写操作,比较常见的操作比如提取文本,导出Excel格式数据,动态生成word文档,生成pdf文档等. 实现这些功能通常需要在服务端安装office软件 ...
- 流媒体测试笔记记录之————解决问题video.js 播放m3u8格式的文件,根据官方的文档添加videojs-contrib-hls也不行的原因解决了
详细代码Github:https://github.com/Tinywan/PHPSharedLibrary/tree/master/Tpl/Html5/VideoJS 想播放hls协议的就是m3u8 ...
- 《C++ Primer》学习笔记【第二部分 C++标准库】
第8章 IO库 IO对象不能复制,即1.IO对象不能存储在vector或其他容器中 2.如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用. 一般情况下,如果要传递IO对象以便对它进 ...