poj crane
#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的更多相关文章
- POJ 2991 Crane(线段树+计算几何)
POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...
- (中等) POJ 2991 Crane , 几何+线段树。
Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...
- POJ 2991 Crane(线段树)
Crane Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7687 Accepted: 2075 Special J ...
- POJ 2991 Crane (线段树)
题目链接 Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of v ...
- AC日记——Crane poj 2991
POJ - 2991 思路: 向量旋转: 代码: #include <cmath> #include <cstdio> #include <cstring> #in ...
- POJ - 2991 Crane (段树+计算几何)
Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...
- POJ 2991–Crane【线段树+几何】
题意: 把手臂都各自看成一个向量,则机械手的位置正好是手臂向量之和.旋转某个关节,其实就是把关节到机械手之间的手臂向量统统旋转. 由于手臂很多,要每个向量做相同的旋转操作很费时间.这时就可以想到用线段 ...
- [poj 2991]Crane[线段树表示向量之和,而非数量]
题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...
- POJ 2991 Crane
线段树+计算几何,区间更新,区间求和,向量旋转. /* *********************************************** Author :Zhou Zhentao Ema ...
随机推荐
- day-4
/* 早上黑板上的倒计时变成了120小时 嗯 很快就要结束了 上午考试 据老师说很简单 老师 :"我就说说~"..... 下午改题 T3好辣脑子 感觉智商不够了 T2dp写丑了 然 ...
- sql2012 新增 OFFSET/FETCH
SQL Server 对行数的排序提供了 TOP 筛选.SQL Server 2012 新增了 OFFSET 筛选. 一.TOP 筛选 如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回 ...
- 异步任务(AsyncTask)
Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕绘图事件等,因此开发者的其他操作不应该.也不能阻塞UI线程,否则UI界面将会变得停止响应——用户感觉非常糟糕.(总之,开发者需要牢 ...
- 启用aspnet
1. 进入dotnetfw目录 cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 2. aspnet_regiis -i -enable
- JQuery Jplayer play无效的问题
最近折腾个H5. 用到Jplayer, 用着不错,至少兼容性强一些. 但是安卓这辆公共汽车型号实在太多.不小心上了一辆奇葩的就容易震到生活不能自理. 我在一台手机上的五六个浏览器上测试,都可以. 把该 ...
- JS中的replace方法以及与正则表达式的结合应用
replace方法的语法是:stringobj.replace(rgexp, replacetext) 其中stringobj是字符串(string),reexp可以是正则表达式对象(regexp)也 ...
- No application 'meetme' for extension 错误
在asterisk中搭建简单会议室,在extensions.conf中执行到 exten => 18,n,MeetMe(18,p) asterisk控制台提示:Aug 6 8:28:41 WAR ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...
- jeesite 经常出现java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL解决思路
本来jeesite是用的maven,但是我开发的项目用这个框架没用maven, 经常报这个错,我能用的办法就是将springmvc—web.jar包删掉,然后重新添加
- OpenCV(7)-图像直方图
直方图定义可参考这里.图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例). 计算直方图 OpenCV提供了直接计算直方图的函数 void calc ...