POJ - 2991 Crane (段树+计算几何)
Description
of the first segment is fixed at point with coordinates (0, 0) and its end at point with coordinates (0, w), where w is the length of the first segment. All of the segments lie always in one plane, and the joints allow arbitrary rotation in that plane. After
series of unpleasant accidents, it was decided that software that controls the crane must contain a piece of code that constantly checks the position of the end of crane, and stops the crane if a collision should happen.
Your task is to write a part of this software that determines the position of the end of the n-th segment after each command. The state of the crane is determined by the angles between consecutive segments. Initially, all of the angles are straight, i.e., 180
o. The operator issues commands that change the angle in exactly one joint.
Input
The first line of each instance consists of two integers 1 ≤ n ≤10 000 and c 0 separated by a single space -- the number of segments of the crane and the number of commands. The second line consists of n integers l1,..., ln (1 li 100) separated by single spaces.
The length of the i-th segment of the crane is li. The following c lines specify the commands of the operator. Each line describing the command consists of two integers s and a (1 ≤ s < n, 0 ≤ a ≤ 359) separated by a single space -- the order to change the
angle between the s-th and the s + 1-th segment to a degrees (the angle is measured counterclockwise from the s-th to the s + 1-th segment).
Output
digits after the decimal point.
The outputs for each two consecutive instances must be separated by a single empty line.
Sample Input
2 1
10 5
1 90 3 2
5 5 5
1 270
2 90
Sample Output
5.00 10.00 -10.00 5.00
-5.00 10.00
题意:有一个n节的机械手,每次让某个节点移动使得第i条边和第i+1条边的夹角是a,初始化夹角都是180度,求经过操作后最后一个节点位置
思路:相同是线段树的区间更新,由于要求的是最后一个点的坐标,我们知道向量是能够相加的,那么我们把每一个线段当成向量相加的话,就能够得到最后的坐标了,再者就是旋转的问题了,我们相同知道旋转后,第i+1后的边都会受到影响,这就是线段树的区间更新了;然后有了逆时针向量旋转的公式我们就能够得到解了。注意的地方是:我们每次储存上一次的角度,依次来推出这次须要旋转的角度,还有就是不知道会平白无故W了还多次,还是换个姿势做的
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define lson(x) ((x) << 1)
#define rson(x) ((x) << 1 | 1)
using namespace std;
const int maxn = 10002; int angle[maxn], setv[maxn<<2];
double sumx[maxn<<2], sumy[maxn<<2]; void update(int pos) {
sumx[pos] = sumx[lson(pos)] + sumx[rson(pos)];
sumy[pos] = sumy[lson(pos)] + sumy[rson(pos)];
} void build(int l, int r, int pos) {
setv[pos] = 0;
if (l == r) {
scanf("%lf", &sumy[pos]);
sumx[pos] = 0;
return;
}
int m = l + r >> 1;
build(l, m, lson(pos));
build(m+1, r, rson(pos));
update(pos);
} void change(int pos, int d) {
double tmp = d * acos(-1.0) / 180;
double x = sumx[pos]*cos(tmp) - sumy[pos]*sin(tmp);
double y = sumx[pos]*sin(tmp) + sumy[pos]*cos(tmp);
sumx[pos] = x;
sumy[pos] = y;
} void push(int pos) {
if (setv[pos]) {
setv[lson(pos)] += setv[pos];
setv[rson(pos)] += setv[pos];
change(lson(pos), setv[pos]);
change(rson(pos), setv[pos]);
setv[pos] = 0;
}
} void modify(int l, int r, int pos, int x, int y, int z) {
if (x <= l && y >= r) {
setv[pos] += z;
change(pos, z);
return;
}
push(pos);
int m = l + r >> 1;
if (x <= m)
modify(l, m, lson(pos), x, y, z);
if (y > m)
modify(m+1, r, rson(pos), x, y, z);
update(pos);
} int main() {
int n, q;
int first = 1;
while (scanf("%d%d", &n, &q) != EOF) {
if (first)
first = 0;
else printf("\n");
build(1, n, 1);
for (int i = 1; i <= n; i++)
angle[i] = 180;
int a, b;
while (q--) {
scanf("%d%d", &a, &b);
modify(1, n, 1, a+1, n, b-angle[a]);
angle[a] = b;
printf("%.2lf %.2lf\n", sumx[1], sumy[1]);
}
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
POJ - 2991 Crane (段树+计算几何)的更多相关文章
- POJ 2991 Crane(线段树+计算几何)
POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...
- POJ 2991 Crane
线段树+计算几何,区间更新,区间求和,向量旋转. /* *********************************************** Author :Zhou Zhentao Ema ...
- POJ 2991 Crane (线段树)
题目链接 Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of v ...
- POJ 2991–Crane【线段树+几何】
题意: 把手臂都各自看成一个向量,则机械手的位置正好是手臂向量之和.旋转某个关节,其实就是把关节到机械手之间的手臂向量统统旋转. 由于手臂很多,要每个向量做相同的旋转操作很费时间.这时就可以想到用线段 ...
- (中等) POJ 2991 Crane , 几何+线段树。
Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...
- POJ 2991 Crane(线段树)
Crane Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7687 Accepted: 2075 Special J ...
- [poj 2991]Crane[线段树表示向量之和,而非数量]
题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...
- POJ 2528 QAQ段树+分离
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submitcid=58236#statu ...
- AC日记——Crane poj 2991
POJ - 2991 思路: 向量旋转: 代码: #include <cmath> #include <cstdio> #include <cstring> #in ...
随机推荐
- php 百度地图 腾讯地图 转换坐标
/* * 中国正常GCJ02坐标---->百度地图BD09坐标 * 腾讯地图用的也是GCJ02坐标 * @param double $lat 纬度 * @param double $lng 经度 ...
- (十)RabbitMQ消息队列-高可用集群部署实战
原文:(十)RabbitMQ消息队列-高可用集群部署实战 前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. Ra ...
- [Django] Auth django app with rest api
First, start the env: . bin/activate Then cd to our module cd djangular Create a new app: python man ...
- UTC时间与当地时间的转换关系?
UTC时间与当地时间转换关系? 一.总结 1.UTC +时区差=本地时间 2.UTC是世界统一时间 二.UTC时间是什么 1.UTC时间 协调世界时,又称世界统一时间.世界标准时间.国际协调时间.由于 ...
- 【b094&&z14】靶形数独
[问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的分们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明的&qu ...
- PhpStorm常用快捷键(不多够用)
PhpStorm常用快捷键(不多够用) 一.总结 一句话总结: 1.前进 解答:Ctrl+shift+ z 2.跳转到指定行数 解答:Ctrl+G 3.块注释 解答:ctrl + shift + / ...
- 【codeforces 779B】Weird Rounding
[题目链接]:http://codeforces.com/contest/779/problem/B [题意] 问你要删掉几个数字才能让原来的数字能够被10^k整除; [题解] /* 数字的长度不大; ...
- tensorflow 函数接口的理解
1. tf.nn.softmax tf.nn.softmax(logits, dim=-1, name=None) w*x+b ⇒ logits softmax 函数执行的操作:exp(logits) ...
- js中的apply与call的用法与区别
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受参数的 ...
- 【codeforces 789C】Functions again
[题目链接]:http://codeforces.com/contest/789/problem/C [题意] 看式子. [题解] 考虑最后的答案区间; 如果那个区间是从奇数位置的数字开始的; 那么奇 ...