#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#define N (10010<<2)
#define maxn 10000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pi acos(-1.0) int ang[N];
double x[N],y[N],len[maxn+]; void Rotate(int rt,double rad)
{
double s=x[rt],t=y[rt];
x[rt]=s*cos(rad)-t*sin(rad);
y[rt]=s*sin(rad)+t*cos(rad);
} double getrad(double x)
{
return x*pi/180.0;
} void PushDown(int rt)
{
if(ang[rt])
{
ang[rt<<]+=ang[rt];
ang[rt<<|]+=ang[rt];
double rad=getrad(ang[rt]);
ang[rt]=;
Rotate(rt<<,rad);
Rotate(rt<<|,rad);
}
} void PushUp(int rt)
{
x[rt]=x[rt<<]+x[rt<<|];
y[rt]=y[rt<<]+y[rt<<|];
} void build(int l,int r,int rt)
{
ang[rt]=;
if(l==r)
{
x[rt]=;
y[rt]=len[l];
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
PushUp(rt);
} void update(int p,int del,int l,int r,int rt)
{
if(l==r)
{
double rad=getrad(del);
Rotate(rt,rad);
return;
}
int m=(l+r)>>;
PushDown(rt);
if(p<=m)
{
double rad=getrad(del);
update(p,del,lson);
Rotate(rt<<|,rad);
ang[rt<<|]+=del;
}
else
update(p,del,rson);
PushUp(rt);
} int main(void)
{
int n,q;
int flag=;
int index,degree[maxn+],d;
while(~scanf("%d%d",&n,&q))
{
memset(degree,,sizeof(degree));
memset(ang,,sizeof(ang));/*旋转角度初始化为0,也就是一开始不旋转,这一步也可以放在build函数里面进行,不能遗漏*/
if(flag) puts("");
else flag=;
for(int i=; i<=n; i++)
scanf("%lf",len+i);
build(,n,);
while(q--)
{
scanf("%d%d",&index,&d);
d-=;
index++;/*index要先增加,然后再和degree[intdex]求旋转角度*/
int delta=d-degree[index];
degree[index]=d;
update(index,delta,,n,);
printf("%.2f %.2f\n",x[],y[]);
}
}
return ;
}

关于Rotae函数是这样理解的,更新时表示index+1段之后的线段绕index段末端点旋转delta度,x,y分别对应index+1之后的线段在x轴,y轴上投影。
根据x'=x*cos(rad)-y*sin(rad),y'=x*sin(rad)+y*cos(rad)可以将旋转后的投影算出来。

poj crane的更多相关文章

  1. POJ 2991 Crane(线段树+计算几何)

    POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...

  2. (中等) POJ 2991 Crane , 几何+线段树。

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

  3. POJ 2991 Crane(线段树)

    Crane Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7687   Accepted: 2075   Special J ...

  4. POJ 2991 Crane (线段树)

    题目链接 Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of v ...

  5. AC日记——Crane poj 2991

    POJ - 2991 思路: 向量旋转: 代码: #include <cmath> #include <cstdio> #include <cstring> #in ...

  6. POJ - 2991 Crane (段树+计算几何)

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

  7. POJ 2991–Crane【线段树+几何】

    题意: 把手臂都各自看成一个向量,则机械手的位置正好是手臂向量之和.旋转某个关节,其实就是把关节到机械手之间的手臂向量统统旋转. 由于手臂很多,要每个向量做相同的旋转操作很费时间.这时就可以想到用线段 ...

  8. [poj 2991]Crane[线段树表示向量之和,而非数量]

    题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...

  9. POJ 2991 Crane

    线段树+计算几何,区间更新,区间求和,向量旋转. /* *********************************************** Author :Zhou Zhentao Ema ...

随机推荐

  1. break continue return 区别

    break语句: break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句.由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才 ...

  2. euqals和hashcode

    hashcode这个方法是用来鉴定2个对象是否相等的. 那你会说,不是还有equals这个方法吗? 不错,这2个方法都是用来判断2个对象是否相等的.但是他们是有区别的. 一般来讲,equals这个方法 ...

  3. CA 配置网站映射

     

  4. 界面动态加载时报NullPointException

    今天在做环境监测的模拟软件时,登陆页面报NullPointException 一般像我们初始化Button时,是Button btn=(Button)findViewById(R.id.button1 ...

  5. SqlServer 事务日志传输

    基本概念 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本 ...

  6. 跳转界面方法 (runtime实用篇一)

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  7. 对REST的一些理解

    昨天学习REST,发现有篇文章写的真心不错,看了一遍,并没有完全理解,将一些感觉比较重要的做个记录.  文章链接:REST简介 定义 Representational State Transfer ( ...

  8. java IO文件读写例子(OutputStream,InputStream,Writer,Reader)

    一,File创建文件 File file = new File("D:" + File.separator + "yi.txt"); 代码示例: package ...

  9. #添加屏蔽IP LINUX

    netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的一种重要功能.有状态的防火墙能够指定并记住为发送或接收信 ...

  10. 解决修改SQL SERVER 默认1433端口 访问出错的问题;

    1. 如何修改 数据库默认的 1433端口: SQL SERVER 配置管理器中 SQLSERVER 网络配置 xxx数据实例的协议中的  TCP/IP 中 默认端口 都修改为 自己定义的端口 例如 ...