思路:根据出发时间把点往速度反方向移动 t*v的 的距离这样就可以当成 全部点一起出发,再把y轴上的点固定不动相当于x轴的点向(-v2,v1)方向移动 。可以把所有点映射到x轴上进行统计即可(要记住同一类型的点事不能相互看到的。因为出发时间不同,就算在x轴上有相同映射点也一样)任务就是 统计每个点能看到多少不同于本身类型的点。 注意在映射的时候由于原先x轴上的点视线是水平的不用改 。y轴上的点原先视线是垂直的要根据夹角转映射到水平。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<time.h>
#include<string>
#define REP(i,n) for(int i=0;i<n;++i)
#define REP1(i,a,b) for(int i=a;i<=b;++i)
#define REP2(i,a,b) for(int i=a;i>=b;--i)
#define MP make_pair
#define LL long long
#define X first
#define Y second
#define MAXN 100050
#define eps 1e-8
using namespace std;
struct Point {
double x, y;
} p1[MAXN], p2[MAXN];
struct Line {
Point p, q;
};
Point Intersect(Line u, Line v) //求两直线交点,需要先判是否平行
{
Point ret = u.p;
double t = ((u.p.x - v.p.x) * (v.p.y - v.q.y)
- (u.p.y - v.p.y) * (v.p.x - v.q.x))
/ ((u.p.x - u.q.x) * (v.p.y - v.q.y)
- (u.p.y - u.q.y) * (v.p.x - v.q.x));
ret.x += (u.q.x - u.p.x) * t;
ret.y += (u.q.y - u.p.y) * t;
return ret;
}
struct node {
double x, w;
int id, type;
} s[MAXN];
bool cmp1(node a, node b) {
return a.x < b.x - eps || (fabs(a.x - b.x) < eps && a.type < b.type);
}
bool cmp2(node a, node b) {
return a.x < b.x - eps || (fabs(a.x - b.x) < eps && a.type > b.type);
}
int d[MAXN];
int ans[MAXN];
int main() {
int tt, ri = , n;
scanf("%d", &tt);
while (tt--) {
Line L;
L.p.x = L.p.y = L.q.y = ;
L.q.x = ;
double v1, v2;
scanf("%d%lf%lf", &n, &v1, &v2);
double si = v1 / sqrt(v1 * v1 + v2 * v2);
REP(i,n)
{
double a, t, p, w;
scanf("%lf%lf%lf%lf", &a, &t, &p, &w);
Line L1;
if (a == ) {
L1.p.x = 1.0*p;
L1.p.y = -1.0*t * v1;
L1.q.x = 1.0*p - v2;
L1.q.y = -1.0*t * v1 + v1;
} else {
L1.p.x = -1.0*t * v2;
L1.p.y = 1.0*p;
L1.q.x = -1.0*t * v2 - v2;
L1.q.y = 1.0*p + v1;
}
Point e = Intersect(L, L1);
s[i].x = e.x;
s[i].type = a;
if(a==)
s[i].w = w ;
else
s[i].w=w*1.0*v2/v1;
s[i].id = i;
}
sort(s, s + n, cmp1);
d[n] = ;
for (int i = n - ; i >= ; --i) {
d[i] = d[i + ];
if (s[i].type == ) {
d[i]++;
continue;
}
int l, r; l = i;
r = n - ;
while (r - l > ) {
int mid = (l + r) >> ;
if (s[mid].x - s[i].x > s[i].w + eps)
r = mid;
else
l = mid;
}
if (s[r].x - s[i].x < s[i].w + eps)
ans[s[i].id] = d[i]-d[r+];
else
ans[s[i].id] = d[i] - d[r];
} sort(s, s + n, cmp2);
d[n] = ;
for (int i = n - ; i >= ; --i) {
d[i] = d[i + ];
if (s[i].type == ) {
d[i]++;
continue;
}
int l, r; l = i;
r = n - ;
while (r - l > ) {
int mid = (l + r) >> ;
if (s[mid].x - s[i].x > s[i].w + eps)
r = mid;
else
l = mid;
}
if (s[r].x - s[i].x < s[i].w + eps)
ans[s[i].id] = d[i]-d[r+];
else
ans[s[i].id] = d[i] - d[r];
}
printf("Case #%d:\n",++ri);
for(int i=;i<n;++i)
printf("%d\n",ans[i]);
}
return ;
}

HDU 4938 Seeing People(2014 Multi-University Training Contest 7)的更多相关文章

  1. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  2. HDU 6125 - Free from square | 2017 Multi-University Training Contest 7

    思路来自这里 - - /* HDU 6125 - Free from square [ 分组,状压,DP ] | 2017 Multi-University Training Contest 7 题意 ...

  3. HDU 6129 - Just do it | 2017 Multi-University Training Contest 7

    比赛时脑子一直想着按位卷积... 按题解的思路: /* HDU 6129 - Just do it [ 规律,组合数 ] | 2017 Multi-University Training Contes ...

  4. HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5

    思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...

  5. HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5

    JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...

  6. HDU 6085 - Rikka with Candies | 2017 Multi-University Training Contest 5

    看了标程的压位,才知道压位也能很容易写- - /* HDU 6085 - Rikka with Candies [ 压位 ] | 2017 Multi-University Training Cont ...

  7. HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4

    /* HDU 6073 - Matching In Multiplication [ 图论 ] | 2017 Multi-University Training Contest 4 题意: 定义一张二 ...

  8. HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3

    /* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...

  9. HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3

    每次NTT都忘记初始化,真的是写一个小时,Debug两个小时- - /* HDU 6061 - RXD and functions [ NTT ] | 2017 Multi-University Tr ...

  10. HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3

    /* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...

随机推荐

  1. Xcode 8

    (一)Xcode8去掉多余LOG 1.打开我们的项目,进入EditScheme 2.我们在Environment Variables中添加OS_ACTIVITY_MODE=disable

  2. 115个Java面试题和答案——终极列表(上)

    本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...

  3. Executor框架(转载)

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...

  4. Linux常用命令及shell脚本

    一.     用户管理(添加用户.切换用户.删除用户) ~                                                                        ...

  5. Mifare系列6-射频卡与读写器的通信(转)

    文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38085415 1. 复位应答(Answer to request) 读写器呼叫磁 ...

  6. nginx缓冲区优化

    关于缓冲, 主要是合理设置缓冲区大小, 尽量避免缓冲到硬盘时的情况 proxy_buffering proxy_buffering这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那 ...

  7. iOS - Regex 正则表达式

    1.Regex 定义 正则表达式又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为 regex.regexp 或 RE),计算机科学的一个概念.正则表达式使用单个 ...

  8. 最新榜单!消金企业TOP10,数据、风控、催收服务方TOP5

    最新榜单!消金企业TOP10,数据.风控.催收服务方TOP5 布谷TIME2016-12-15 17:47:59消费 风控阅读(164)评论(0) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账 ...

  9. php访问远程服务器上的文件

    test.php <?php $fp=fopen('http://www.baidu.com', 'r'); while (!feof($fp)) { $chunk=fgets($fp); ec ...

  10. 使用Let`s encrypt 免费的https 证书

    在iOS上以前暂时屏蔽https使用http的接口,将在未来被苹果拒绝: 之前传苹果会在2017年1月1日强制要求支持https,但是现在苹果又延迟该计划了 https://developer.app ...