题目大意:

给定n条首尾相接的线段的长度

第一条从0,0开始,所有线段垂直与x轴向上延伸

给定c次操作 每次操作给定 s,a

使得 由第s条线段的角度 逆时针旋转a后 达到第s+1条线段的角度

每次操作后输出最后一条线段末尾端点的坐标

向量逆时针旋转公式为

x' = x * cos(A) - y * sin(A); y' = x * sin(A) + y * cos(A);

一个向量  (x,y)  可分解两个向量为 垂直于y轴的(x,0) 和垂直于x轴的 (0,y)

两个分向量逆时针A度后

(x',0) = ( x*coa(A),x*sin(A) )   (0,y') = ( -y*sin(A),y*cos(A) )

两个旋转后的分向量 再合并就可得到旋转后的 (x',y')

用线段树维护一段区间内由 该区间内第一段线段的起点 指向 最后一段线段的末尾的向量

每次操作更新区间时 我们只对 操作位置处于当前区间的左子区间 的区间更新

那么这样当更新一段区间时 当前向量=左子区间的向量+右子区间旋转后的的向量

并且对于区间长度为1的区间不做处理

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const double PI=acos(-1.0);
  4. const int N=;
  5.  
  6. int n,c,L[N];
  7. double pre[N];
  8.  
  9. double angT[N<<];
  10. double x[N<<],y[N<<];
  11.  
  12. void build(int k,int l,int r) {
  13. angT[k]=x[k]=0.0;
  14. if(r==l) y[k]=L[l];
  15. else {
  16. int lson=k*, rson=k*+;
  17. int m=(l+r)/;
  18. build(lson,l,m);
  19. build(rson,m+,r);
  20. y[k]=y[lson]+y[rson];
  21. }
  22. }
  23. void change(int s,double ang,int k,int l,int r) {
  24. if(s<l || l==r) return; // 操作位置不在范围内 或 区间长度为1 不作处理
  25. else if(s<=r) {
  26. int lson=k*, rson=k*+;
  27. int m=(l+r)/;
  28. change(s,ang,lson,l,m);
  29. change(s,ang,rson,m+,r); // 先处理左右子区间
  30. if(s<=m) angT[k]+=ang; // 操作位置位于区间的左子区间内 可根据左右子区间的向量更新
  31.  
  32. double sina=sin(angT[k]), cosa=cos(angT[k]);
  33. x[k]=x[lson]+(x[rson]*cosa-y[rson]*sina);
  34. y[k]=y[lson]+(x[rson]*sina+y[rson]*cosa);
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. while(~scanf("%d%d",&n,&c)) {
  41. for(int i=;i<=n;i++) {
  42. scanf("%d",&L[i]);
  43. pre[i]=PI;
  44. }
  45. build(,,n);
  46. while(c--) {
  47. int s,a; scanf("%d%d",&s,&a);
  48. double ang=(double)a/180.0*PI;
  49. change(s,ang-pre[s],,,n);
  50. pre[s]=ang; // 要求改变为a度 考虑之前已改变过
  51. printf("%.2f %.2f\n",x[],y[]);
  52. }
  53. printf("\n");
  54. }
  55.  
  56. return ;
  57. }

Crane /// 向量旋转+线段树的更多相关文章

  1. 【BZOJ4311】向量(线段树分治,斜率优化)

    [BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...

  2. BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )

    答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN) ...

  3. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

  4. BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)

    Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...

  5. 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包

    题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...

  6. [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]

    题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...

  7. bzoj 3533: [Sdoi2014]向量集 线段树维护凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...

  8. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

  9. BZOJ_4311_向量_线段树按时间分治

    BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y) ...

随机推荐

  1. (转)Linux环境进程间通信----系统 V 消息队列列

    转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...

  2. 4.1 react 代码规范

    关于 基础规范 组件结构 命名规范 jsx 书写规范 eslint-plugin-react 关于 在代码的设计上,每个团队可能都有一定的代码规范和模式,好的代码规范能够提高代码的可读性便于协作沟通, ...

  3. mysql(自动添加系统时间)timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性

    timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1.CURRENT_TIMESTAMP 当要向 ...

  4. 【转】console.dir()和console.log()的区别

    原文链接:https://blog.csdn.net/ky1in93/article/details/80828499 console对象详解:https://segmentfault.com/a/1 ...

  5. linux 两个进程通过 共享内存 通信例子

    例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...

  6. Windows server 2016 / Windows 10关于域管理员帐号权限不足的问题

    今天在测试windows server 2016的域创建时,当安装结束之后,发现使用Administrator用户进行操作时,被提示了权限不足这个问题.于是我在百度上查找了一番之后,找到了解决方法. ...

  7. 错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算

    问题描述:错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算 原因描述:一.首先我的系统是因为是win10 的有问题,重新装了系统. 二. ...

  8. 笔记29 视图解析 ——InternalResourceViewResolver

    Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现 首先将会介绍 InternalResourceViewResolver,这个视图解析器一般会用来 解析JSP视图.  1. Spri ...

  9. spark-sql中的分析函数的使用

    分析函数的应用场景: (1)用于分组后组内排序 (2)指定计算范围 (3)Top N (4)累加计算 (5)层次计算 分析函数的一般语法: 分析函数的语法结构一般是: 分析函数名(参数)  over  ...

  10. P1487 失落的成绩单

    P1487 失落的成绩单a[i]=a[i-2]-2.0*a[i-1]+2.0*d;a[2]越大,a[3]越小a[3]越大,a[4]越小所以a[2]越大,a[4]越大,a[3]越小就有了单调性,分奇偶进 ...