STL之map、set灵活使用
1、LA 5908/UVA1517 Tracking RFIDs
题意:给出s个传感器的位置,以及其感应范围。如果某个方向上有墙,则该方向上感应距离减1.现在有w个墙,给出p个物品的位置,问其能被几个传感器探测到。
思路:传感器用set保存。之后传感器和物品之间是否有墙用线段是否相交来判断。
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
const double eps = 1e-; struct point
{
int x, y;
point(int xx=, int yy=):x(xx),y(yy){ }
friend bool operator < (const point& a,const point& b)
{
return (a.x != b.x) ? a.x < b.x : a.y < b.y;
}
};
struct line
{
int x;
int y;
line(int xx=,int yy=):x(xx),y(yy){ }
}; line operator - (point a, point b)
{//得到点a和点b形成的直线的方向向量
return line(a.x - b.x, a.y - b.y);
}
int cross(line a, line b)
{//返回0则两条直线平行,否则,直线相交:大于0说明b.y/b.x>a.y/a.x,b的斜率大
return a.x * b.y - b.x * a.y;
}
double dis(point a, point b)
{//两点之间的直线距离
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
} int direction(point p1, point p2, point p3)
{//判断点p3在直线p1-p2上还是在其两侧,上侧为负,下侧为正,在直线上为0
return cross(p3 - p1, p2 - p1);
} //判断点np是否在线段p1-p2
bool on_segment(point p1, point p2, point np)
{
if (np.x < min(p1.x, p2.x)) return false;
if (np.x > max(p1.x, p2.x)) return false;
if (np.y < min(p1.y, p2.y)) return false;
if (np.y > max(p1.y, p2.y)) return false;
return true;
} //判断线段p1-p2和p3-p4是否相交
bool segment_intersect(point p1, point p2, point p3, point p4)
{
// 必须用 long long
ll d1 = direction(p1, p2, p3);
ll d2 = direction(p1, p2, p4);
ll d3 = direction(p3, p4, p1);
ll d4 = direction(p3, p4, p2); if (d1 * d2 < && d3 * d4 < ) return true;//p1、p2分别在线段p3-p4两侧,并且p3、p4分别在线段p1-p2两侧则说明两条线段相交
if (d1 == && on_segment(p1, p2, p3)) return true;
if (d2 == && on_segment(p1, p2, p4)) return true;
if (d3 == && on_segment(p3, p4, p1)) return true;
if (d4 == && on_segment(p3, p4, p2)) return true;
return false;
} set<int> sensors[];//传感器坐标
set<int>::iterator it;
point wall_l[], wall_r[];//墙的起止点坐标 int main()
{
int T;
scanf("%d", &T); while (T--)
{
for (int i = ; i < ; i++)
sensors[i].clear(); int s, r, w, p;
scanf("%d%d%d%d", &s, &r, &w, &p); for (int i = ; i < s; i++)
{
int x, y;
scanf("%d%d", &x, &y);
sensors[x + ].insert(y);//注意x为负数处理
} for (int i = ; i < w; i++)
scanf("%d%d%d%d", &wall_l[i].x, &wall_l[i].y, &wall_r[i].x, &wall_r[i].y); while (p--)
{
point p1;
scanf("%d%d", &p1.x, &p1.y); vector<point> ans;
for (int i = -r; i <= r; i++)
{//枚举x差值
int x = p1.x + i;
int y = ceil(p1.y - sqrt(r*r - (p1.x - x)*(p1.x - x)));//确定当前x坐标y可取下限
int k = x + ;
if (k < || k > ) continue;
it = sensors[k].lower_bound(y);
while (it != sensors[k].end())
{//传感器的横坐标为x,从当前y值增加
point p2(x, *it++);//当前可取传感器
double d = dis(p1, p2);
if (d > r + eps) break; double add = ;
for (int k = ; k < w; k++)//判断是否有墙在两点之间
if (segment_intersect(p1, p2, wall_l[k], wall_r[k])) add++; if (d + add < r + eps) ans.push_back(p2);
}
}
sort(ans.begin(), ans.end());
printf("%d", ans.size());
for (int i = ; i < ans.size(); i++)
printf(" (%d,%d)", ans[i].x, ans[i].y);
printf("\n");
}
}
return ;
}
2、 LA 3634/UVA 12096 The SetStack Computer
题意:模拟集合栈。
思路:给每一个不同集合映射一个编号。
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <algorithm>
#include<iterator>
using namespace std; map<set<int>, int> id;
map<set<int>, int>::iterator it;
vector<set<int> > v;
char op[];
int getID(set<int> x)
{
it = id.find(x);
if (it != id.end())
return it->second;
v.push_back(x);
return id[x] = v.size() - ;
} int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
id.clear();
v.clear();
stack<int> s;
while (n--)
{
scanf("%s", op);
if (op[] == 'P')
s.push(getID(set<int>()));
else if (op[] == 'D')
s.push(s.top());
else
{
set<int> t1 = v[s.top()]; s.pop();
set<int> t2 = v[s.top()]; s.pop();
set<int> t;
if (op[] == 'U')
{
set_union(t1.begin(), t1.end(), t2.begin(), t2.end(), inserter(t, t.begin()));
s.push(getID(t));
}
else if (op[] == 'I')
{
set_intersection(t1.begin(), t1.end(), t2.begin(), t2.end(), inserter(t, t.begin()));
s.push(getID(t));
}
else if (op[] == 'A')
{
t2.insert(getID(t1));
s.push(getID(t2));
}
}
printf("%d\n",v[s.top()].size());
}
printf("***\n");
}
return ;
}
STL之map、set灵活使用的更多相关文章
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- STL中map与hash_map的比较
1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O ...
- STL中map,set的基本用法示例
本文主要是使用了STL中德map和set两个容器,使用了它们本身的一些功能函数(包括迭代器),介绍了它们的基本使用方式,是一个使用熟悉的过程. map的基本使用: #include "std ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
- C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET
C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...
- STL之map排序
描述 STL的map中存储了字符串以及对应出现的次数,请分别根据字符串顺序从小到大排序和出现次数从小到大排序. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { ...
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- C++ STL中Map的按Key排序跟按Value排序
C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...
- [STL] Implement "map", "set"
练习热身 Ref: STL中map的数据结构 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re ...
- stl中map的四种插入方法总结
stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...
随机推荐
- CSS3主要知识点复习总结+HTML5新增标签
文件夹: 1.CSS 属性编写顺序 2.CSS3属性(内核前缀) 3.position相对/绝对定位 4.overflow:scroll等的差别 5.display属性应用 6.盒模型计算方法和Bug ...
- Tomcat控制台输出
在Tomcat中,默认将终端输出信息输出到: $CATALINA_HOME/logs/catalina.out 其中$CATALINA_HOME是tomcat的安装目录. tomcat启动后,该文件 ...
- html-解决乱码问题
1.创建HTML时,需将文件编码设置为UTF-8: 2.需要在<head>元素下,借用<meta>元素设置内容的编码: 1)文件的编码:在webstorm中设置文件编码的问题: ...
- 基于windows的resin配置
Resin 与 Eclipse for JavaEE 的整合方法: 1.新建一个项目,将web application配置到resin.conf中 附上resin_struts2-111.conf文件 ...
- samba实现文件共享
很多时候,做嵌入式开发,都是在windows上安装虚拟,在虚拟机中安装Linux操作系统.这个时候,我们经常需要Linux操作系统下有一个目录能在windows下自由访问.要想实现这个功能我们只需要在 ...
- 通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。
通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML. JavaScript 能够改变页面中的所有 HTML 元素 JavaScript 能够改变页面中的所有 HTML ...
- python 爬虫3 异常处理
1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常.下 ...
- oracle密码过期解决方法
Oracle提示错误消息ORA-28001: the password has expired 在oracle服务器上用sqlplus / as sysdba登录进去,可以通过下面的sql语句查看账户 ...
- thinkPHP为什么设置一个单入口文件?
TP3.2的具体解释: ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个应用都有一个统一(但不一定是唯一)的入口. 应该说,所有应用都是从入口文件开始的,并且不同应用的入口文 ...
- 面试题:Spring的理解
答案:D AOP为Aspect Oriented Programming的缩写, 意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续,是软件开发 ...