HDU 4938 Seeing People(2014 Multi-University Training Contest 7)
思路:根据出发时间把点往速度反方向移动 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)的更多相关文章
- HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...
- HDU 6125 - Free from square | 2017 Multi-University Training Contest 7
思路来自这里 - - /* HDU 6125 - Free from square [ 分组,状压,DP ] | 2017 Multi-University Training Contest 7 题意 ...
- HDU 6129 - Just do it | 2017 Multi-University Training Contest 7
比赛时脑子一直想着按位卷积... 按题解的思路: /* HDU 6129 - Just do it [ 规律,组合数 ] | 2017 Multi-University Training Contes ...
- HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5
思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...
- HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5
JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...
- HDU 6085 - Rikka with Candies | 2017 Multi-University Training Contest 5
看了标程的压位,才知道压位也能很容易写- - /* HDU 6085 - Rikka with Candies [ 压位 ] | 2017 Multi-University Training Cont ...
- HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4
/* HDU 6073 - Matching In Multiplication [ 图论 ] | 2017 Multi-University Training Contest 4 题意: 定义一张二 ...
- 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 ...
- HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3
每次NTT都忘记初始化,真的是写一个小时,Debug两个小时- - /* HDU 6061 - RXD and functions [ NTT ] | 2017 Multi-University Tr ...
- HDU 6060 - RXD and dividing | 2017 Multi-University Training Contest 3
/* HDU 6060 - RXD and dividing [ 分析,图论 ] | 2017 Multi-University Training Contest 3 题意: 给一个 n 个节点的树, ...
随机推荐
- Nginx添加到windows服务
在windows平台,把Nginx注册到服务,又可以启动.停止和重启的方法,网上并没找到好的办法. 既然如此,唯有自己写程序实现了 使用C#进行编写,有兴趣的可以下载源码自己改:源码下载(2016-1 ...
- freemaker时间格式转换,精确到毫秒
在开发中,需要将时间以 2016-09-20 12:00:01:723 的形式里用freemaker展示在页面上,找了好久,终于找到了答案. "createTime":" ...
- ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
问题:ObjectStateManager 中已存在具有同一键的对象.ObjectStateManager 无法跟踪具有相同键的多个对象. 解决方案:在查询的时候加上AsNoTracking()就ok ...
- Http referer origin
为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的.如果浏览器不能确定源在哪里,那么在发送的请求里面 ...
- property内存管理策略
1普通数据,用weak 2delegate,用weak 3一般对象,用strong 4NSString,用copy 5block,用copy
- 火狐浏览器 js 1到9月份 new DATE不返回时间
new Date('2016-1'); //错误 1到9月份必须 01 02 ...... 正确 new Date('2016-01'); var nowMonth = nowMonth>=10 ...
- Remoting&WebService的区别之处
Remoting与Web Services的区别是:(1)既支持TCP信道又支持HTTP信道,传输速度快(2)即可传输XML的SOAP包又可传输二进制流,效率高(3)Remoteing主要用于C/S结 ...
- 【转】 memcmp源码实现
原型: int memcmp(void *buf1, void *buf2, unsigned int count); 用法:#include <string.h> 功能:比较内存区域bu ...
- MySQL DML 整理
DML(Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects. 由D ...
- SPSS数据分析—最优尺度回归
在之前介绍的线性回归模型中,有一个隐含的假设是自变量均为连续变量,但实际上自变量有时候是分类变量,类似于方差分析中的因素,这种分类自变量在回归分析中,也默认作为连续变量使用,这就会产生一个问题,如果是 ...