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. 360 网络攻防 hackgame 解题报告(通关)

    地址:http://challenge.onebox.so.com/ 1.referrer or host 2.js decode 3.urldecode, ASCII 4.JFIF * 2 5.go ...

  2. int abs(int number)函数有感: 求补码和通过补码求对应的整数 C++(增加:数字的二进制表示中1的个数)

    #include "limits.h" #include "math.h" int abs(int number) { int const mask = num ...

  3. UVA11082 Matrix Decompressing 最大流建模解矩阵,经典

    /** 题目:UVA11082 Matrix Decompressing 链接:https://vjudge.net/problem/UVA-11082 题意:lrj入门经典P374 已知一个矩阵的行 ...

  4. Help Hanzo lightof 1197 求一段区间内素数个数,[l,r] 在 [1,1e9] 范围内。r-l<=1e5; 采用和平常筛素数的方法。平移区间即可。

    /** 题目:Help Hanzo lightof 1197 链接:https://vjudge.net/contest/154246#problem/M 题意:求一段区间内素数个数,[l,r] 在 ...

  5. 微信强大的demo

    https://github.com/xialeistudio/wechatPublicPlatform

  6. struts.properties文件

    此配置文件提供了一种机制来更改默认行为的框架.其实所有的struts.propertiesconfiguration文件中包含的属性也可以被配置在web.xml中使用的init-param,以及在st ...

  7. Android项目页面跳转小Demo

    近期在做Android项目的开发,刚刚接触会有非常多新东西须要学习,从环境的搭建到语言的熟悉都是须要一步步完毕的,接下来就拿一个页面跳转的样例来和大家分享一下自己的心得体会. 採用的架构: Demo中 ...

  8. Week 3: Assessing performance 笔记

    得到一个模型之后如何评价其性能? training error & generalization error & test error 如何理解generalization error ...

  9. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(2)

    聚类概念: 聚类:简单地说就是把相似的东西分到一组.同 Classification (分类)不同,分类应属于监督学习.而在聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到 ...

  10. C++中的return返回值:return0 or return -1?

    C++98 中定义了如下两种 main 函数的定义方式: int main( ) int main( int argc, char *argv[] )   (参考资料:ISO/IEC 14882(19 ...