思路:

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

 #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. C++实现KMP模式匹配算法

    #include<iostream> #include<string> #include<vector> using namespace std; void Nex ...

  2. Ubuntu下配置Tomcat以指定(非root)身份执行

    My Blog:http://www.outflush.com/ 通常情况下.在配置Tomcat生产环境时,一般会配置Tomcat以特定的身份执行(非root).这样有利于提高安全性,防止站点被黑后的 ...

  3. 移动端html5页面长按实现高亮全选文本内容的兼容解决方式

    近期须要给html5的WebAPP在页面上实现一个复制功能:用户点击长按文本会全选文字并弹出系统"复制"菜单.用户能够点击"复制"进行复制操作.然后粘贴到App ...

  4. UISlider无法拖动进度条的问题解决

    UISlider无法拖动进度条的问题解决 最近业务中的视频播放使用到了UISlider,但是有一个奇怪的问题,就是在Modar出来的控制器中UISlider是可以正常使用的,但是在Push出来的控制器 ...

  5. java8--Mysql数据库与JDBC编程(java疯狂讲义3复习笔记)

    JDBC:java database connectivity 数据库基本命令: 启动 show databases; create database [if not exists] 数据库名; do ...

  6. HTTP网络请求原理 (三) 简单模拟HTTP服务器

    HTTP实际上是基于TCP的应用层协议,它在更高的层次封装了TCP的使用细节,是网络请求操作更为易用. TCP连接是因特网上基于流的可靠连接,它为HTTP提供了一条可靠的比特传输管道. 从TCP连接一 ...

  7. C# ref和out总结

    C# 中ref 与 out 总结   参数的传递一般分为两种:一种是“值传递”即:传递实参的拷贝,既然是拷贝那么在函数中对这个形参所作的任何动作都不会反映到原来的实参中.另外一种是“引用传递”即:传递 ...

  8. Linux设备模型 (4)

    <Linux设备模型 (2)>和<Linux设备模型 (3)>主要通过一些简单的实作介绍了kobject.kset.kobj_type.attribute等数据结构的用法,但这 ...

  9. ChartCtrl源码剖析之——CChartGrid类

    CChartGrid类用来绘制波形区域中的表格,当绘制波形时波形就显示在这些表格上面.它处于该控件的区域,如下图所示: CChartGrid类的头文件. #if !defined(AFX_CHARTG ...

  10. 微信公众号开发——创建自定义菜单(PHP版)

    <?php include "TokenUtil.php"; //TokenUtil::build_access_token(); $access_token = Token ...