思路:

线段树每个节点维护第一条线段起点指向最后一条线段终点的向量,于是每一个操作都是一次区间更新。使用成段更新的线段树即可。
实现:

 #include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring> using namespace std; const int MAXN = ;
const double PI = acos(-1.0); int a[MAXN], d[MAXN], n, c;
struct node
{
double x, y;
int lazy;
};
node tree[MAXN << ];
double trans(int d) { return (double)d * PI / 180.0; }
void rotate(double & x, double & y, int dx)
{
double tx = x * cos(trans(dx)) - y * sin(trans(dx));
double ty = y * cos(trans(dx)) + x * sin(trans(dx));
x = tx; y = ty;
}
void pushdown(int num)
{
if (!tree[num].lazy) return;
int tmp = tree[num].lazy;
rotate(tree[num << ].x, tree[num << ].y, tmp);
rotate(tree[num << | ].x, tree[num << | ].y, tmp);
tree[num << ].lazy += tmp;
tree[num << | ].lazy += tmp;
tree[num].lazy = ;
}
void pushup(int num)
{
tree[num].x = tree[num << ].x + tree[num << | ].x;
tree[num].y = tree[num << ].y + tree[num << | ].y;
}
void build(int num, int l, int r)
{
if (l == r) { tree[num].y = a[r]; return; }
int m = l + r >> ;
build(num << , l, m);
build(num << | , m + , r);
pushup(num);
}
void update(int num, int l, int r, int x, int y, int dx)
{
if (x <= l && y >= r)
{
rotate(tree[num].x, tree[num].y, dx);
tree[num].lazy += dx;
return;
}
int m = l + r >> ;
pushdown(num);
if (x <= m) update(num << , l, m, x, y, dx);
if (y >= m + ) update(num << | , m + , r, x, y, dx);
pushup(num);
} int main()
{
while (scanf("%d %d", &n, &c) != EOF)
{
for (int i = ; i <= n * ; i++) { tree[i].x = tree[i].y = ; tree[i].lazy = ; }
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
for (int i = ; i < n; i++) d[i] = ;
build(, , n);
int x, y;
for (int i = ; i < c; i++)
{
scanf("%d %d", &x, &y);
int dx = y - d[x];
d[x] = y;
update(, , n, x + , n, dx);
printf("%.2f %.2f\n", tree[].x, tree[].y);
}
puts("");
}
return ;
}

poj2991 Crane的更多相关文章

  1. poj2991 Crane(线段树)

    Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...

  2. POJ-2991 Crane(区间更新+向量旋转)

    题目大意:n个向量首尾相连,每次操作使某个区间中的所有向量都旋转同样的角度.每次操作后都回答最后一个向量的坐标. 题目分析:区间维护向量信息.向量旋转:x1=x0*cos(t)-y0*sin(t),y ...

  3. poj2991 Crane(线段树+集合)白书例题

    题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...

  4. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  5. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  6. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  7. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  8. 【转】 线段树完全版 ~by NotOnlySuccess

    载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...

  9. 【转载】完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...

随机推荐

  1. Swift开发--Storyboard的使用教程

    假设App中包含非常多不同的页面,使用Storyboard能够帮你降低实现页面间跳转的胶合代码. 过去的开发人员相应每一个视图控制器分别创建界面设计文件(即"nib"或" ...

  2. uva live 4394 String painter 区间dp

    // uva live 4394 String painter // // 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现例子过了.然而自己 ...

  3. UVA 10288 - Coupons(概率递推)

    UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...

  4. list if else 遍历 特征合并

    特征合并 import re l = ['a', 'b1'] ll = [i if re.search('\d', i) is None else i[0:re.search('\d', i).end ...

  5. LeetCode 7. Reverse Integer (JS)

    Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Examp ...

  6. UESTC149 解救小Q

    小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她.迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到传送阵的另一头.现在请你 ...

  7. bzoj4593: [Shoi2015]聚变反应炉

    这道题的难点其实是在设DP方程,见过就应该会了 令f0,i表示先激发i的父亲,再激发i,把i的整棵子树都激发的最小费用 f1,i表示先激发i,再激发i的父亲,把i的整棵子树都激发的最小费用 设x,y为 ...

  8. Kotlin 单例

    单例的实现方法,可以通过同伴对象,或者 lazy. 示例: class Hello private constructor() { companion object { val instance = ...

  9. apktool工具下载地址

    apktool工具下载地址 http://ibotpeaches.github.io/Apktool/

  10. [Usaco2017 Feb]Why Did the Cow Cross the RoadII

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4993 [算法] 动态规划 转移类似于求LCS [代码] #include<bi ...