set的用法一直拖着,今天才算真正会了,小小总结一下(我好菜啊啊啊)

#include<bits/stdc++.h>

using namespace std;
set<int> s;int n,x,a[]; int main(){
freopen("7.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]),s.insert(a[i]); set<int>::iterator it;
//遍历
for(it=s.begin();it!=s.end();it++)
//s.end()实际上没有值,s.end()迭代器指向的东西已经超出数组本身内容,
//若要返回的值实际上是set的size
cout<<*it<<" ";cout<<endl;
//查找值所对应的迭代器
it=s.lower_bound();
//对于无重复元素的set lower_bound和upper_bound无区别
//输出迭代器所指向的值
cout<<*it<<endl; return ;
}
//5
//8 4 2 6 10

例题:

巧克力

【问题背景】

平面直角坐标系中有一块长方形的巧克力。左下角坐标是(0,0),右上角坐标是(n,m)。现在要在这块巧克力上切p刀,求每次切完后,最大的一块完整的巧克力的面积。

【输入格式】

第一行三个正整数n,m,p。表示巧克力的大小和要切割的次数。

以下p行每行一个大写字母ci和一个整数ai。

若ci=‘V’则表示从x=ai处切割;若ci=‘H’则表示从y=ai处切割。

【输出格式】

输出一共p行,第i行为第i次切割后的答案。

【输入样例】

7 6 5

H 4

V 3

V 5

H 2

V 1

【输出样例】

28

16

12

6

4

【样例说明】

【数据范围】

50%的数据:p<=1000。

100%的数据:p,m,n<=100000。

思路:naive的我开始真的啥都不会啊,暴力写了个sort(因为真的不知道set能自动排序....辣鸡如我)

code 1   50分

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
int n,m,p,k,top1,top2,FG,x[N],y[N];char opt[];
LL mx; void find(){mx=;
if(FG==) sort(x+,x++top1);
if(FG==) sort(y+,y++top2);
for(int i=;i<=top1;i++)
for(int j=;j<=top2;j++)
mx=max(mx,(LL)(x[i]-x[i-])*(y[j]-y[j-]));
} int main(){
freopen("chocolate.in","r",stdin);
freopen("chocolate.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
x[++top1]=n;y[++top2]=m;
for(register int i=;i<=p;i++){
scanf("%s%d",opt,&k);
if(opt[]=='V') x[++top1]=k,FG=;
if(opt[]=='H') y[++top2]=k,FG=;
find();printf("%lld\n",mx);
}
return ;
}

后来胡乱瞄了一眼std发现要用set,所以写了如下的set代码,(真的巨麻烦)

set维护位置,priority_queue维护大小,但是优先队列不能遍历,所以就打标记代表它已经被用掉了,虽然麻烦点但是不知道为甚恶魔有些WA掉了,40分(还不如暴力sort,嘤嘤嘤)

code2 40分

#include<bits/stdc++.h>
#define LL long long
using namespace std; const int N=1e6+;
struct nodex{
int l,r,siz,id;
bool operator<(const nodex& a)const{
return siz<a.siz;}
};priority_queue<nodex> qx,qy; set<int> sx,sy;
char opt[];
int n,m,p,k,cntx[N],cnty[N]; void changex(int k2){
set<int>::iterator it1,it2;
it2=sx.lower_bound(k2);
it1=--it2;++it2; int k1=*it1,k3=*it2; sx.insert(k2);
qx.push((nodex){k1,k2,k2-k1,++cntx[k1]});
qx.push((nodex){k2,k3,k3-k2,++cntx[k2]});
}
void changey(int k2){
set<int>::iterator it1,it2;
it2=sy.lower_bound(k2);
it1=--it2;++it2; int k1=*it1,k3=*it2;sy.insert(k2);
qy.push((nodex){k1,k2,k2-k1,++cnty[k1]});
qy.push((nodex){k2,k3,k3-k2,++cnty[k2]});
}
int main(){
freopen("chocolate.in","r",stdin);
freopen("chocolate.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
sx.insert();sx.insert(n);qx.push((nodex){,n,n,++cntx[]});
sy.insert();sy.insert(m);qy.push((nodex){,m,m,++cnty[]});
for(int i=;i<=p;i++){
scanf("%s%d",opt,&k);
if(opt[]=='V') changex(k);
if(opt[]=='H') changey(k);
int mxx=,mxy=;
while(!qx.empty()){
nodex u=qx.top();
if(u.id!=cntx[u.l]) qx.pop();
else{mxx=u.siz;break;}
}
while(!qy.empty()){
nodex u=qy.top();
if(u.id!=cnty[u.l]) qy.pop();
else{mxy=u.siz;break;}
}
printf("%lld\n",(LL)mxx*mxy);
}
return ;
}

最后认真看了题解,学了set发现,这题不就是个大水题么,multiset轻松搞过,,,(辣鸡如我*2)

code 3 AC

#include<bits/stdc++.h>
#define LL long long
using namespace std; const int N=1e6+; set<int> sx,sy;
multiset<int> mx,my;
char opt[];int n,m,p,k; int main(){
freopen("chocolate.in","r",stdin);
freopen("chocolate.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
sx.insert();sx.insert(n);
sy.insert();sy.insert(m);
mx.insert(n);my.insert(m);
for(int i=;i<=p;i++){
scanf("%s%d",opt,&k);
int mxx=,myy=;
if(opt[]=='V'){
set<int>::iterator it;
it=sx.lower_bound(k);
int v=*it,u=*(--it);
sx.insert(k); mx.erase(mx.lower_bound(v-u));
mx.insert(v-k);
mx.insert(k-u);
}if(opt[]=='H'){
set<int>::iterator it;
it=sy.lower_bound(k);
int v=*it,u=*(--it);
sy.insert(k); my.erase(my.lower_bound(v-u));
my.insert(v-k);
my.insert(k-u);
}mxx=*(mx.rbegin());myy=*(my.rbegin());
printf("%lld\n",(LL)mxx*myy);
}
return ;
}

完结撒花!!

set用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

  10. [转]thinkphp 模板显示display和assign的用法

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

随机推荐

  1. LOJ#6280. 数列分块入门 4

    另外开一个数组维护每一个块内的总和. 给区间加值是,残余的块一个一个点更新,整个的块一次性更新 查询的时候也是,残余的块一个一个点加,整个的块一次性加 #include<map> #inc ...

  2. Tbox在整车CAN网络的位置与作用

    我们讲到了智能车载娱乐系统的5个基本特征: 基本来说, 当今的智能车机基本有以下几个特点: 基于智能操作系统: Android, Yunos, Linux等 基本都是虚拟按键, 较少用实体按键 具备外 ...

  3. Anaconda For Linux (附C#交互式编程的引入)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Jupyter美化: https://www.cnblogs.com/dotnetcra ...

  4. 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Python3 与 C# 基础语法对比:https://www.cnblogs.com/ ...

  5. Luogu--3381 【模板】最小费用最大流

    题目链接 3381 [模板]最小费用最大流 手写堆版本 dijkstra   400+ms 看来优先队列的常数好大 #include<bits/stdc++.h> using namesp ...

  6. js click 与 onclick 事件绑定,触发与解绑

    click 与 onclick 1.onclick 事件会在对象被点击时发生. <input id="btn1" type="button" onclic ...

  7. 1062.Talent and Virtue

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...

  8. 有趣的js获取input标签中光标的索引

    先看动图如下,我们就可以很清楚的知道获取input标签中光标的索引的意思了. 由于IE支持document.selection,Firefox,Chrome,Safari以及Opera都有select ...

  9. log4j 配置,tomcat 启动或有后台操作时,控制台会显示很多 DEBUG 信息

    log4j 配置,tomcat 启动或有后台操作时,控制台会显示很多 DEBUG 信息 日志信息可以以文件形式显示,也可以在控制台输出,在 log4j.properties 文件设置. 控制台有很多 ...

  10. 为什么fork()2次会避免产生僵尸进程

    什么是僵尸进程:用fork()创建子进程后,子进程已终止但父进程没有对它进行善后处理,那么子进程的进程描述符就一直保存在内存中,子进程就是僵尸进程. 怎么产生僵尸进程: 1.父进程没有SIGCHLD信 ...