Description
Input
Output
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 (线段树+计算几何),布布扣,bubuko.com
原文:http://blog.csdn.net/u011345136/article/details/38370039