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灵活使用的更多相关文章

  1. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...

  2. STL中map与hash_map的比较

    1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O ...

  3. STL中map,set的基本用法示例

    本文主要是使用了STL中德map和set两个容器,使用了它们本身的一些功能函数(包括迭代器),介绍了它们的基本使用方式,是一个使用熟悉的过程. map的基本使用: #include "std ...

  4. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  5. C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET

    C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...

  6. STL之map排序

    描述 STL的map中存储了字符串以及对应出现的次数,请分别根据字符串顺序从小到大排序和出现次数从小到大排序. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { ...

  7. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  8. C++ STL中Map的按Key排序跟按Value排序

    C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...

  9. [STL] Implement "map", "set"

    练习热身 Ref: STL中map的数据结构 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re ...

  10. stl中map的四种插入方法总结

    stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...

随机推荐

  1. 微信小程序新建项目完整流程

    最近刚好也在做新的小程序项目,所以有机会给大家整理一个完整的开发流程! 上一篇介绍是如何获得appid,那么接下来就是怎么新建一个全新的小程序项目了 首先:下载最新版的微信开发者工具,支持网页版微信开 ...

  2. Linux下查看分区UUID

    有两种方法: 1.#:blkid 2.ls -l /dev/disk/by-uuid/

  3. FromHBITMAP 这个函数会丢失透明信息。

    在用 FromHBITMAP 你会发现出来的图是带有黑边的,这是因为这个函数有个 bug,解决的办法是用下列的函数进行转换,大体意思就是自己 memcpy 不要用 FromHBITMAP 函数. Bi ...

  4. GitBlit (1)-- 在linux 安装 GitBlit 并运行

    Git是一款注重速度.数据完整性.分布式支持和非线性工作流的分布式版本控制工具.Git最初由Linus Torvalds在2005年为Linux内核开发而设计,如今已经成为被广泛接受的版本控制系统. ...

  5. tomcat本身的lib目录都有哪些jar包

    1.tomcat下的lib目录,自己带有的jar包有:servlet.jar,tomcat-jdbc.jar,tomncat-dbcp.jar,jsp.jar等 2.tomcat下的lib目录,自己带 ...

  6. Spring 入门之-dao使用jdbcTemplate(注入过程)

    技巧:在为把dataSourc连接池注入到jdbcTemplate里面时,学到一招:按住CTRL 不松,点击相关类名,可以自动跳转或打开. 说明:主要过程, 1.创建UserDao和UserServi ...

  7. 寒城攻略:Listo 教你用Swift 语言编写 IOS 平台流媒体播放器

    先展示播放器效果:   依然继承 Listo 本人的强迫症,还是从最初到完毕完整的写一个攻略来记录一下,这里声明 Listo 本人也是看了非常多的戴维营攻略才总结分享给大家这一篇攻略的. 首先,Lis ...

  8. spark使用KryoRegistrator java代码示例

    转载引用自:http://www.cnblogs.com/tovin/p/3833985.html 最近在使用spark开发过程中发现当数据量很大时,如果cache数据将消耗很多的内存.为了减少内存的 ...

  9. CentOS6.8部署SVN

    第1章 安装svn服务 1.1 准备操作系统并查看系统环境 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.8 (Final) ...

  10. Android无线测试之—UiAutomator UiSelector API介绍之一

    一. UiSelector类介绍: 1) UiSelector类说明: UiSelector代表一种搜索条件,可以在当前界面上查询和获取特定元素的句柄,当找到多余一个的匹配元素,则返回布局层次结构上第 ...