思路:根据出发时间把点往速度反方向移动 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. 参考:鼠标点击事件(Selenium)

    1.鼠标右键点击操作:Actions action = new Actions(driver) ;action.contextClick(driver.findElement(By.xpath(xpa ...

  2. UIButton的文本与图片的布局

    UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢 其实很简单,今天总结下,目 ...

  3. servlet(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  4. Spring Security3中的-authentication-manager标签详解

    讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...

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

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

  6. A little bit about Handlers in JAX-WS

    by Rama Pulavarthi Handlers are message interceptors that can be easily plugged in to the JAX-WS run ...

  7. X.509,RSA,PKCS 普及

    X.509 X.509是一种非常通用的证书格式.所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用. 在一份证书中,必须证明公钥 ...

  8. go并发3

    Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.s ...

  9. Dictionary<k,v>键值对的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Dict ...

  10. java时间类型的转换/获取当前时间/将时间转换成String/将String转换成时间

    对于我的脑子,我已经服气了...写了N遍的东西,就是记不住...既然记不住那就记下来... 利用java获取当前的时间(String类型,年-月-日 时:分:秒) //我要获取当前的日期 Date d ...