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, int, greater<int> >,然后用迭代器指向最后一个key就行了

代码:

#include<set>
#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 20000 + 10;
const int seed = 131;
const int MOD = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
set<ll> x, y;
multiset<ll> lenx, leny;
int main(){
    int T;
    ll n, m, q;
    scanf("%d", &T);
    while(T--){
        scanf("%lld%lld%lld", &n, &m, &q);
        x.clear();
        y.clear();
        lenx.clear();
        leny.clear();
        x.insert(0),x.insert(n),lenx.insert(n);
        y.insert(0),y.insert(m),leny.insert(m);
        set<ll>::iterator it;
        while(q--){
            ll o, p;
            scanf("%lld%lld", &o, &p);
            if(o == 0 && x.count(p) == 0){
                it = x.lower_bound(p);
                lenx.insert(*it - p);
                int len = *it - *(--it);
                lenx.erase(lenx.find(len));
                lenx.insert(p - *it);
                x.insert(p);
            }
            else if(o == 1 && y.count(p) == 0){
                it = y.lower_bound(p);
                leny.insert(*it - p);
                int len = *it - *(--it);
                leny.erase(leny.find(len));
                leny.insert(p - *it);
                y.insert(p);
            }
            it = lenx.end();
            ll chang = *(--it);
            it = leny.end();
            ll kuan = *(--it);
            printf("%lld\n", chang * kuan);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/KirinSB/p/9552879.html

时间: 2024-11-10 14:35:24

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

(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 alway

STL笔记(1)map

STL笔记(1)map STL之map ZZ from http://hi.baidu.com/liyanyang/blog/item/d5c87e1eb3ba06f41bd576cf.html 1.map中的元素其实就是一个pair. 2. map的键一般不能是指针, 比如int*, char*之类的, 会出错. 常用的就用string了,int也行. 3. map是个无序的容器, 而vector之类是有序的. 所谓有序无序是指放入的元素并不是按一定顺序放进去的, 而是乱序, 随机存放的(被映

HDU Bombing (STL multiset+map)

题意:给你 n 个坐标(x,y),m 个询问(c,d) c==0,求出x==d有多少个,并删除这些点: c==1,求出y==d有多少个,并删除这些点. map+multiset的多重映射 #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream>

C++STL之关联容器【map】【set】

map以键-值対的形式组织,键的作用在于索引,而值表示所存储和读取数据. set仅包含一个键,并且有效的支持某个键是否存在的查询. 他们都是基于标准型类库pair实现,该类型在utility头文件中. 一:关于pair类型的操作 pair<T1,T2> p1; //创建一个空pair类型 pair<T1,T2> p1(v1,v2); //创建并初始化 make_pair(v1,v2) //生成pair对象 <,>,==,!=  //类型之间比较,遵循字典序,先比较fir

C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法

每次忘记都去查,真难啊 1 /* 2 C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法 3 */ 4 5 /* 6 vector常用用法 7 */ 8 //头文件 9 #include<vector> 10 11 //常用的初始化方法 12 vector<int> v; //直接定义一个整型元素的向量 且未声明长度,其中int的位置可以换成别的数据类型或者结构体等 13 vector<int> v(10);

SPOJ:Ada and Orange Tree (LCA+Bitset)

Ada the Ladybug lives near an orange tree. Instead of reading books, she investigates the oranges. The oranges on orange tree can be in up to 5*50 Shades of Orange. She walks from orange to orange, examining different properties of orange tree. The o

C++ STL源码学习(map,set内部heap篇)

stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap. template <class _RandomAccessIterator, class _Distance, class _Tp> void __push_heap(_RandomAccessIterator __first, _Distance __holeIndex, _Distance

STL源码剖析(set/map)

SGI STL中set/map底层都是通过RB-tree实现的. 首先看看RB-tree结点的定义 1 typedef bool __rb_tree_color_type; 2 const __rb_tree_color_type __rb_tree_red = false; 3 const __rb_tree_color_type __rb_tree_black = true; 4 5 // 结点的基类 6 struct __rb_tree_node_base 7 { 8 typedef __

11.STL简单set和multiset的实现

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