(STL之set与multiset)SPOJ - Ada and Field(易)

ADAFIELD - Ada and Field

#binary-search #datastructures

Ada the Ladybug owns a beautiful field where she grows vegetables. She often visits local Farmers Market, where she buys new seeds. Since two types of vegetable can‘t share same field, she always divide the field, by either vertical or horizontal line (she is very precise, so the width of line is negligible). Since she visits Farmers Market almost every day, she has already made a lot of such lines, so she needs your help with finding out the area of biggest field.

Input

The first line will contain 0 < T ≤ 200, the number of test-cases.

Then T test-cases follow, each beginning with three integers 1 ≤ N,M ≤ 2*109, 1 ≤ Q ≤ 105, top right corner of field (field goes from [0,0] to [N,M]) and number of field divisions.

Afterward Q lines follows:

0 x (0 ≤ x ≤ N), meaning that line was made vertically, on coordinate x

1 y (0 ≤ y ≤ M), meaning that line was made horizontally, on coordinate y

Sum of Q over all test-cases won‘t exceed 106

Output

Print Q lines, the area of biggest field after each line was made.

Example Input

2
10 10 5
0 5
0 8
1 1
1 9
1 5
10 10 5
0 5
1 4
1 6
1 8
0 5

Example Output

50
50
45
40
20
50
30
20
20
20

不了解set与multiset的话会感到有些无从下手,使用之后问题就变得简单。

分别建立set维护行列中线的位置,以及multiset记录行间距、列间距。

每次最大面积就是行间距最大值*列间距最大值(注意这个可能超过int范围)

以插入新的一行为例(显然,列同理)

如果之前没有插入过这一行:

利用lower_bound找到第一个比它高的行(由于初始化时将边界都insert进去,所以必定存在)之前行间距记录的是这一行及比其低的第一行的间距,要更新为插入的这一行与它们的行间距。只要erase原本的行间距,插入新的两个行间距即可。

如果之前插入过:

无需进行任何操作。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 typedef long long ll;
14 typedef unsigned long long ull;
15 const int MAX=1e6+5;
16 const int INF=-1e9;
17 using namespace std;
18 typedef pair<int,int> pii;
19 int t;
20 int n,m,Q;
21 int zuo,you,len;
22 set <int> hang,lie;//记录行列位置
23 multiset <int> hlen,llen;//记录行列距离
24 ll an;
25 int opt,x;
26 void init()
27 {
28     hang.clear();lie.clear();hlen.clear();llen.clear();
29     hang.insert(0);hang.insert(n);hlen.insert(n);
30     lie.insert(0);lie.insert(m);llen.insert(m);
31 }
32 int main()
33 {
34     scanf("%d",&t);
35     set<int>::iterator p;
36     multiset<int>::iterator q;
37     while(t--)
38     {
39         scanf("%d%d%d",&n,&m,&Q);
40         init();
41         while(Q--)
42         {
43             scanf("%d%d",&opt,&x);
44             if(opt)
45             {
46                 if(lie.find(x)==lie.end())
47                 {
48                     p=lie.lower_bound(x);
49                     you=*p;
50                     p--;
51                     zuo=*p;
52                     q=llen.find(you-zuo);
53                     llen.erase(q);
54                     len=you-x;
55                     llen.insert(len);
56                     len=x-zuo;
57                     llen.insert(len);
58                     lie.insert(x);
59                 }
60
61             }
62             else
63             {
64                 if(hang.find(x)==hang.end())
65                 {
66                     p=hang.lower_bound(x);
67                     you=*p;
68                     p--;
69                     zuo=*p;
70                     q=hlen.find(you-zuo);
71                     hlen.erase(q);
72                     len=you-x;
73                     hlen.insert(len);
74                     len=x-zuo;
75                     hlen.insert(len);
76                     hang.insert(x);
77                 }
78             }
79                 q=llen.end();q--;
80                 an=(ll)(*q);
81                 q=hlen.end();q--;
82                 an=(ll)(*q)*an;
83                 printf("%lld\n",an);
84         }
85     }
86
87 }
时间: 2024-10-13 02:12:50

(STL之set与multiset)SPOJ - Ada and Field(易)的相关文章

HDU 4022 Bombing(stl,map,multiset,iterater遍历)

题目 参考了     1     2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. //multiset可以允许重复 //multiset<int>::iterator it; 用来遍历 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream&g

SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解

题意:n*m的方格,"0 x"表示x轴在x位置切一刀,"0 y"表示y轴在y位置切一刀,每次操作后输出当前面积最大矩形. 思路:用set分别储存x轴y轴分割的点,用multiset(可重复)储存x轴y轴边,每次输出最大的长和最大的宽的积.题目可能重复切.multiset如果直接erase(13)会把所有的13都删掉,如果只想删一个则erase(multiset.find(13)).第一次知道set自带二分... 这里multiset也可以用map<int, i

11.STL简单set和multiset的实现

set的特性是所有元素都会根据键值自动排序,set的元素不像map那样同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值.Set不允许两个元素拥有相同的键值.不能通过迭代器修改set元素的值. multiset和set的唯一区别在于multiset允许键值重复. 我们采用红黑树作为set和multiset的底层数据结构,set和multiset的实现完完全全是在红黑树的基础上封装的一层接口,所有的set和multiset操作都转而调用红黑树的API.有关STL红黑

【C++ STL】Set和Multiset

1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. 只要是assignable.copyable.comparable(根据某个排序准则)的型别T,都可以成为set或者multisets的元素.如果没有特别的排序原则,采用默认的less,已operator < 对元素进行比较,以便完成排序. 排序准则必须遵守以下原则: 必须是"反对称的",对operator <而言,如果x < y为

STL中 set 和 multiset

1. 所在头文件: <set>, 命名空间: std ; 声明如下: 1 namespace std{ 2 template <class T, 3 class Compare = less<T>, 4 class Allocator = allocator<T> > 5 class set; 6 template <class T, 7 class Compare = less<T>, 8 class Allocator = alloca

STL之五:set/multiset用法详解

集合 转载于:http://blog.csdn.net/longshengguoji/article/details/8546286 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和multiset内部以平衡二叉树实现 1.   常用函数 1)        构造函数和析构函数 set c:创建空集合,不包含任何元素 set c(op):以op为排序准则,产生一个空的

从一道整数合并问题学习 STL 之make_heap &amp;&amp;priority_queue&amp;&amp;multiset

[题目链接]:click here~~ [题目大意]: 描述       小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.小明决定把所有的果子合成一堆. 因为小明比较懒,为了省力气,小明开始想点子了: 每一次合并,小明可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.小明在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以小明在

C++ STL源码学习(之RB Tree篇)

stl_tree.h 这是整个STL中最复杂的数据结构,也是我接触到的最复杂的数据结构之一 /** Red-black tree class, designed for use in implementing STL associative containers (set, multiset, map, and multimap). The insertion and deletion algorithms are based on those in Cormen, Leiserson, and

STL 之 list源码自行实现(iterator)

(0)文件夹 STL 之 vector源码实现(云算法<< [] = 重载, new delete,throw catch) STLc++中string类的源码 堆(stack) 之 c 和 c++模板实现(空类默认成员函数 初谈引用 内联函数) 第一次实现list模板(幼稚的我) 浅析STL 谓词 + 仿函数 + 函数指针(c) 队列(queue) 之 c++模板实现(友元函数和运算符重载) STL 之 初识set multiset(map multimap) C++map类型 之 简单介绍