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. 李洪强iOS开发之OC[006] - 类和对象

  2. java - day09 - summerize

    猜字母游戏 package day08_summerize; import java.util.Scanner; import java.util.Random; //猜字母游戏 /** * @aut ...

  3. codeblocks中给GCC编译器加参数

    在使用gcc命令行编译的时候可以使用gcc xxx.c -o xxx.exe -std=c99来使用c99标准编译 但是在codeblocks中默认是不使用c99标准编译的,如何加参数呢? Setti ...

  4. Windows手动安装MySQL

    由于MySQL 5.6(也许5.5)以后去掉了Server Instance Configuration Wizard(服务实例配置向导),于是msi版变成了和zip版一样,要手动配置. * 假定安装 ...

  5. webpack issues

    webpack-dev-server安装失败 npm ERR! path C:\Users\YYT\Desktop\dot_webpack\node_modules\express\node_modu ...

  6. 本地调试远程api tag

    当你在本地开发js且需要跨域调用远程接口的时候.可按照下列步骤设置你的chrome.   1.创建chrome快捷方式.     2.右键属性新的快捷方式,在目标一栏后面追加 "--args ...

  7. 去除Android打开软件出现的红边框

    /********************************************************************** * 去除Android打开软件出现的红边框 * 说明: ...

  8. LeetCode 递归(Recursion) 培训专题 讲解文章翻译 (附链接)

     递归 - 时间复杂度 在本文中, 我们主要介绍如何分析递归算法程序中的时间复杂度.. 在一个递归程序中, 它的时间复杂度 O(T) 一般来说就是他总共递归调用的次数 (定义为 R) 以及每次调用时所 ...

  9. linux shell习题训练

    shell习题训练 求2个数之和 计算1-100的和 将一目录下所有的文件的扩展名改为bak 编译当前目录下的所有.c文件: 打印root可以使用可执行文件数,处理结果: root's bins: 2 ...

  10. Java Web -- Servlet(1) 必备知识

    学习Java WEB开发必备的基本概念: 1.WEB 本意是蜘蛛网和网的意思.在网页设计中我们称为网页的意思. 现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本(hypertext).超媒体 ...