mxqz,CF太毒瘤了
  • 板块CF47E Cannon
  • 楼主Link_Cut_Y
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/3 18:24
  • 上次更新2023/10/27 00:36:09
查看原帖
mxqz,CF太毒瘤了
519384
Link_Cut_Y楼主2022/12/3 18:24
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

#define x first
#define y second

using namespace std;
using PDD = pair<double, double>;

const double g = 9.8;
const int N = 100010;

struct Point {
	double alp; int id;
	bool operator < (const Point& tmp)const {
		return tmp.alp > alp;
	}
}p[N];
int n, m;
double v, vx;
PDD w[N], ans[N];

double get(double x, double alpha) {
	double vx = v * cos(alpha), t = x / vx;
	return v * sin(alpha) * t - g * t * t / 2.0;
}

void get(double alp, PDD &ans) {
	ans = {2.0 * sin(alp) * cos(alp) * v * v / g, 0};
}

int main() {
	scanf("%d%lf", &n, &v);
	for (int i = 1; i <= n; i ++ )
		scanf("%lf", &p[i].alp), p[i].id = i;
	sort(p + 1, p + n + 1);
	scanf("%d", &m);
	for (int i = 1; i <= m; i ++ )
		scanf("%lf%lf", &w[i].x, &w[i].y);
	sort(w + 1, w + m + 1);
	
	int now = 1; // 上一个炮弹打到的墙的下标
	for (int i = 1; i <= n; i ++ ) {
		double alp = p[i].alp; int id = p[i].id;
		if (now == n + 1) { get(alp, ans[id]); continue; }
		double h; // 炮弹在 w[now].x 的高度
		for (; ; now ++ ) {
			if (now == n + 1) break;
			h = get(w[now].x, alp);
			if (h <= w[now].y) break;
		}
		if (now == n + 1 || h <= 0) { get(alp, ans[id]); continue; } // 能够成功落地
		ans[id] = {w[now].x, get(w[now].x, alp)}; // 撞墙
	}
	
	for (int i = 1; i <= n; i ++ )
		printf("%.9lf %.9lf\n", ans[i].x, ans[i].y);
	return 0;
}

2022/12/3 18:24
加载中...