Crane /// 向量旋转+线段树
题目大意:
给定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的区间不做处理
- #include <bits/stdc++.h>
- using namespace std;
- const double PI=acos(-1.0);
- const int N=;
- int n,c,L[N];
- double pre[N];
- double angT[N<<];
- double x[N<<],y[N<<];
- void build(int k,int l,int r) {
- angT[k]=x[k]=0.0;
- if(r==l) y[k]=L[l];
- else {
- int lson=k*, rson=k*+;
- int m=(l+r)/;
- build(lson,l,m);
- build(rson,m+,r);
- y[k]=y[lson]+y[rson];
- }
- }
- void change(int s,double ang,int k,int l,int r) {
- if(s<l || l==r) return; // 操作位置不在范围内 或 区间长度为1 不作处理
- else if(s<=r) {
- int lson=k*, rson=k*+;
- int m=(l+r)/;
- change(s,ang,lson,l,m);
- change(s,ang,rson,m+,r); // 先处理左右子区间
- if(s<=m) angT[k]+=ang; // 操作位置位于区间的左子区间内 可根据左右子区间的向量更新
- double sina=sin(angT[k]), cosa=cos(angT[k]);
- x[k]=x[lson]+(x[rson]*cosa-y[rson]*sina);
- y[k]=y[lson]+(x[rson]*sina+y[rson]*cosa);
- }
- }
- int main()
- {
- while(~scanf("%d%d",&n,&c)) {
- for(int i=;i<=n;i++) {
- scanf("%d",&L[i]);
- pre[i]=PI;
- }
- build(,,n);
- while(c--) {
- int s,a; scanf("%d%d",&s,&a);
- double ang=(double)a/180.0*PI;
- change(s,ang-pre[s],,,n);
- pre[s]=ang; // 要求改变为a度 考虑之前已改变过
- printf("%.2f %.2f\n",x[],y[]);
- }
- printf("\n");
- }
- return ;
- }
Crane /// 向量旋转+线段树的更多相关文章
- 【BZOJ4311】向量(线段树分治,斜率优化)
[BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...
- BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )
答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN) ...
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)
Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...
- 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包
题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...
- [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]
题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...
- bzoj 3533: [Sdoi2014]向量集 线段树维护凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...
- bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题
题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...
- BZOJ_4311_向量_线段树按时间分治
BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y) ...
随机推荐
- (转)Linux环境进程间通信----系统 V 消息队列列
转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...
- 4.1 react 代码规范
关于 基础规范 组件结构 命名规范 jsx 书写规范 eslint-plugin-react 关于 在代码的设计上,每个团队可能都有一定的代码规范和模式,好的代码规范能够提高代码的可读性便于协作沟通, ...
- mysql(自动添加系统时间)timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1.CURRENT_TIMESTAMP 当要向 ...
- 【转】console.dir()和console.log()的区别
原文链接:https://blog.csdn.net/ky1in93/article/details/80828499 console对象详解:https://segmentfault.com/a/1 ...
- linux 两个进程通过 共享内存 通信例子
例子1:两个进程通过共享内存通信,一个进程向共享内存中写入数据,另一个进程从共享内存中读出数据 文件1 创建进程1,实现功能,打印共享内存中的数据 #include <stdio.h> # ...
- Windows server 2016 / Windows 10关于域管理员帐号权限不足的问题
今天在测试windows server 2016的域创建时,当安装结束之后,发现使用Administrator用户进行操作时,被提示了权限不足这个问题.于是我在百度上查找了一番之后,找到了解决方法. ...
- 错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算
问题描述:错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算 原因描述:一.首先我的系统是因为是win10 的有问题,重新装了系统. 二. ...
- 笔记29 视图解析 ——InternalResourceViewResolver
Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现 首先将会介绍 InternalResourceViewResolver,这个视图解析器一般会用来 解析JSP视图. 1. Spri ...
- spark-sql中的分析函数的使用
分析函数的应用场景: (1)用于分组后组内排序 (2)指定计算范围 (3)Top N (4)累加计算 (5)层次计算 分析函数的一般语法: 分析函数的语法结构一般是: 分析函数名(参数) over ...
- 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]越小就有了单调性,分奇偶进 ...