思路:

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

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7.  
  8. const int MAXN = ;
  9. const double PI = acos(-1.0);
  10.  
  11. int a[MAXN], d[MAXN], n, c;
  12. struct node
  13. {
  14. double x, y;
  15. int lazy;
  16. };
  17. node tree[MAXN << ];
  18. double trans(int d) { return (double)d * PI / 180.0; }
  19. void rotate(double & x, double & y, int dx)
  20. {
  21. double tx = x * cos(trans(dx)) - y * sin(trans(dx));
  22. double ty = y * cos(trans(dx)) + x * sin(trans(dx));
  23. x = tx; y = ty;
  24. }
  25. void pushdown(int num)
  26. {
  27. if (!tree[num].lazy) return;
  28. int tmp = tree[num].lazy;
  29. rotate(tree[num << ].x, tree[num << ].y, tmp);
  30. rotate(tree[num << | ].x, tree[num << | ].y, tmp);
  31. tree[num << ].lazy += tmp;
  32. tree[num << | ].lazy += tmp;
  33. tree[num].lazy = ;
  34. }
  35. void pushup(int num)
  36. {
  37. tree[num].x = tree[num << ].x + tree[num << | ].x;
  38. tree[num].y = tree[num << ].y + tree[num << | ].y;
  39. }
  40. void build(int num, int l, int r)
  41. {
  42. if (l == r) { tree[num].y = a[r]; return; }
  43. int m = l + r >> ;
  44. build(num << , l, m);
  45. build(num << | , m + , r);
  46. pushup(num);
  47. }
  48. void update(int num, int l, int r, int x, int y, int dx)
  49. {
  50. if (x <= l && y >= r)
  51. {
  52. rotate(tree[num].x, tree[num].y, dx);
  53. tree[num].lazy += dx;
  54. return;
  55. }
  56. int m = l + r >> ;
  57. pushdown(num);
  58. if (x <= m) update(num << , l, m, x, y, dx);
  59. if (y >= m + ) update(num << | , m + , r, x, y, dx);
  60. pushup(num);
  61. }
  62.  
  63. int main()
  64. {
  65. while (scanf("%d %d", &n, &c) != EOF)
  66. {
  67. for (int i = ; i <= n * ; i++) { tree[i].x = tree[i].y = ; tree[i].lazy = ; }
  68. for (int i = ; i <= n; i++) scanf("%d", &a[i]);
  69. for (int i = ; i < n; i++) d[i] = ;
  70. build(, , n);
  71. int x, y;
  72. for (int i = ; i < c; i++)
  73. {
  74. scanf("%d %d", &x, &y);
  75. int dx = y - d[x];
  76. d[x] = y;
  77. update(, , n, x + , n, dx);
  78. printf("%.2f %.2f\n", tree[].x, tree[].y);
  79. }
  80. puts("");
  81. }
  82. return ;
  83. }

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. 【iOS系列】-iOS开发,GET,POST请求使用

    [iOS系列]-iOS开发,GET,POST请求使用 步骤: 1:实例化URL(网络资源) 2:根据URL建立URLRequest(网络请求) 默认为GET请求: 对于POST请求,需要创建请求的数据 ...

  2. 关于集成支付宝SDK的开发

    下载 首先,你要想找到这个SDK,都得费点功夫.如今的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 "请点此下载集成开发包" Baidu和Googlep排在前面的支付宝开 ...

  3. Eclipse 变量点击高亮显示以及自己定义高亮显示颜色

    1.方法一:alt+shift+o 打开/关闭,该功能 2.方法二:windows-> preferences->java->Editor->Mark Occurences ( ...

  4. 2016/3/24 ①数据库与php连接 三种输出fetch_row()、fetch_all()、fetch_assoc() ②增删改时判断(布尔型) ③表与表之间的联动 ④下拉菜单 ⑤登陆 三个页面

    ①数据库与php连接   图表 header("content-type:text/html;charset=utf-8"); //第一种方式: //1,生成连接,连接到数据库上的 ...

  5. jquery中注意点

    1.jquery.fn.extend和jquery.extend jquery.fn.extend是向jquery中的prototype中添加方法或者属性,而jquery.extend是向jquery ...

  6. bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段 ...

  7. Pessimistic Offline Lock悲观离线锁

    每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突. 离线并发处理通常会出现多个业务事务操作同一数据. 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务. 首选乐 ...

  8. springMVC访问根路径问题

    当web.xml没有配置欢迎页:如下 <welcome-file-list> <welcome-file>login.jsp</welcome-file> < ...

  9. C#即时通讯系统设计与实现(一)

    最近学习了一下即时通讯,写了几天了,现在把遇到的问题和得到的心得在这里分享下. 即时通讯,C/S模式,在服务器上架设服务端,服务端是服务形式的,可以设置为开机自启动,客户端进行访问,可以安装在任意一台 ...

  10. PHP tripos()函数使用需要注意的问题

    tripos() 函数返回字符串在另一个字符串中第一次出现的位置.这在PHP字符串匹配与替换的时候常用到,但是很多时候我们总感觉当查找的字符串在源字符串的开头的时候总会不好使. 原来stripos() ...