set用法
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用法的更多相关文章
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
- [转]thinkphp 模板显示display和assign的用法
thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...
随机推荐
- luogu4162 最长距离 (dijkstra)
相邻格子连双向边,如果一个点有障碍,那进它的边权就是1,否则是0 这样的话,两点间的最短路+[起始点有障碍],就是从一个点走到另一个需要清除的障碍的个数 求出最短路后枚举这两个点就可以了 然而30*3 ...
- Chinese Mahjong UVA - 11210 (DFS)
先记录下每一种麻将出现的次数,然后枚举每一种可能得到的麻将,对于这个新的麻将牌,去判断可不可能胡,如果可以胡,就可以把这张牌输出出来. 因为eye只能有一张,所以这个是最好枚举的,就枚举每张牌成为ey ...
- Centos 7下下载和安装docker
sudo yum install -y device-mapper sudo modprobe dm_mod ls -l /sys/class/misc/device-mapper sudo rpm ...
- JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?
一,问题描述 假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗? 二,示例代码(代码 ...
- 【POJ2230】Watchcow
题目大意:给定一个 N 个点,M 条边的无向图,要求不重复地经过每条边两次,并且从 1 号节点出发最后回到 1 号节点,求一条路径. 题解:不重复地经过两次这个操作很容易地通过无向图的建边方式来实现, ...
- WebClient请求接口,get和post方法
1,get方式 string URI = "url"; //实例化 WebClient client = new WebClient(); // client.UseDefault ...
- 【css技能提升】完美的 Sticky Footer 布局
在总结之前所做的项目时,遇到过下面这种情况. 在主体内容不足够多或者未完全加载出来之前,就会导致出现左边的这种情况,原因是因为没有足够的垂直空间使得页脚推到浏览器窗口最底部.但是,我们期望的效果是页脚 ...
- [luogu4309][最长上升子序列]
题目链接 思路 因为这些数字是从小到大加进去的,所以以当前数字结尾的最长上升子序列可以从前面位置的任何一个数字转移过来.所以只要能知道每个数字最终位于哪个位置就行了. 没想到出了treap还有什么办法 ...
- poj 2229 Sumsets(记录结果再利用的DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 将一个数N分解为2的幂之和共有几种分法? 题解: 定义dp[ i ]为数 i 的 ...
- iis8.0 https配置教程
打开iis>选择左侧根>点击右侧服务器证书 打开界面后 空白处点击右键选择导入 成功导入证书 选择需要绑定证书的网站点击选择>编辑绑定>ssl证书请选择您导入的证书 点击SSL ...