poj2991 Crane 向量旋转+线段树

Crane POJ - 2991 区间更新 + 计算几何 一、内容 ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of various lengths, connected by flexible joints. The end of the i-th segment is joined to the beginning of the i + ... 阅读详情

Crane
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 3962 Accepted: 1072 Special Judge

Description

ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of various lengths, connected by flexible joints. The end of the i-th segment is joined to the beginning of the i + 1-th one, for 1 ≤ i < n. The beginning of the first segment is fixed at point with coordinates (0, 0) and its end at point with coordinates (0, w), where w is the length of the first segment. All of the segments lie always in one plane, and the joints allow arbitrary rotation in that plane. After series of unpleasant accidents, it was decided that software that controls the crane must contain a piece of code that constantly checks the position of the end of crane, and stops the crane if a collision should happen.

Your task is to write a part of this software that determines the position of the end of the n-th segment after each command. The state of the crane is determined by the angles between consecutive segments. Initially, all of the angles are straight, i.e., 180o. The operator issues commands that change the angle in exactly one joint.

Input

The input consists of several instances, separated by single empty lines.

The first line of each instance consists of two integers 1 ≤ n ≤10 000 and c 0 separated by a single space -- the number of segments of the crane and the number of commands. The second line consists of n integers l1,..., ln (1 li 100) separated by single spaces. The length of the i-th segment of the crane is li. The following c lines specify the commands of the operator. Each line describing the command consists of two integers s and a (1 ≤ s < n, 0 ≤ a ≤ 359) separated by a single space -- the order to change the angle between the s-th and the s + 1-th segment to a degrees (the angle is measured counterclockwise from the s-th to the s + 1-th segment).

Output

The output for each instance consists of c lines. The i-th of the lines consists of two rational numbers x and y separated by a single space -- the coordinates of the end of the n-th segment after the i-th command, rounded to two digits after the decimal point.

The outputs for each two consecutive instances must be separated by a single empty line.

Sample Input

2 1
10 5
1 90

3 2
5 5 5
1 270
2 90

Sample Output

5.00 10.00

-10.00 5.00
-5.00 10.00

    吊车有N截,最开始都在y轴上,M个操作,把s+1以上部分旋转,使s和s+1角度为a,每次操作后输出最高一截顶部的坐标。

   线段树x,y维护当前区间从头连到尾的向量,degree为相对于坐标轴的旋转角度,setv为要pushdown的角度。每次操作先询问当前第s+1截和s截的角度,做差,再用a减去这个角度就是要旋转的角度。然后在[s+1,N]区间update这个角度。

  逆时针旋转公式:x'=cosa*x-sina*y,y'=sina*x+cosa*y。

  每次操作后输出tree.x[1],tree.y[1]。

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<algorithm>
#define pi (4*atan(1.0))
typedef long long LL;
using namespace std;

const int MAXN=10010;
const int MAXNODE=4*MAXN;

int N,M,Y[MAXN];

struct SegmentTree{
    double x[MAXNODE],y[MAXNODE];
    int setv[MAXNODE],degree[MAXNODE];

    void maintain(int o){
        x[o]=x[o<<1]+x[o<<1|1];
        y[o]=y[o<<1]+y[o<<1|1];
    }

    void build(int o,int L,int R){
        setv[o]=0;
        if(L>=R){
            y[o]=Y[L];
            x[o]=0;
            degree[L]=0;
            return;
        }
        int mid=L+(R-L)/2;
        build(o<<1,L,mid);
        build(o<<1|1,mid+1,R);
        maintain(o);
    }

    void rotate(double& x,double& y,int deg){
        double tmpx=x,tmpy=y,a=deg/180.0*pi;
        x=tmpx*cos(a)-tmpy*sin(a);
        y=tmpx*sin(a)+tmpy*cos(a);
    }

    void pushdown(int o,int L,int R){
        if(setv[o]>0){
            setv[o<<1]=(setv[o<<1]+setv[o])%360;
            setv[o<<1|1]=(setv[o<<1|1]+setv[o])%360;
            int mid=L+(R-L)/2;
            if(L>=mid) degree[L]=(degree[L]+setv[o])%360;
            if(mid+1>=R) degree[R]=(degree[R]+setv[o])%360;
            rotate(x[o<<1],y[o<<1],setv[o]);
            rotate(x[o<<1|1],y[o<<1|1],setv[o]);
            setv[o]=0;
        }
    }

    void update(int o,int L,int R,int ql,int qr,int deg){
        if(ql<=L&&qr>=R){
            setv[o]=(setv[o]+deg)%360;
            if(L>=R) degree[L]=(degree[L]+deg)%360;
            rotate(x[o],y[o],deg);
            return;
        }
        pushdown(o,L,R);
        int mid=L+(R-L)/2;
        if(ql<=mid) update(o<<1,L,mid,ql,qr,deg);
        if(qr>mid) update(o<<1|1,mid+1,R,ql,qr,deg);
        maintain(o);
    }

    int query(int o,int L,int R,int pos){
        if(L>=R) return degree[L];
        pushdown(o,L,R);
        int mid=L+(R-L)/2;
        if(pos<=mid) return query(o<<1,L,mid,pos);
        else return query(o<<1|1,mid+1,R,pos);
    }
}tree;

int main(){
    freopen("in.txt","r",stdin);
    int cas=0;
    while(scanf("%d%d",&N,&M)!=EOF){
        if(cas++) puts("");
        for(int i=1;i<=N;i++) scanf("%d",&Y[i]);
        tree.build(1,1,N);
        int s,deg;
        while(M--){
            scanf("%d%d",&s,°);
            int tmp=(180+tree.query(1,1,N,s+1)-tree.query(1,1,N,s)+360)%360;
            tree.update(1,1,N,s+1,N,(deg-tmp+360)%360);
            printf("%.2lf %.2lf\n",tree.x[1],tree.y[1]);
        }
    }
    return 0;
}


TriCore架构-如何将系统刷成HSM 本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。 阅读详情

相关推荐

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

POJ 2991 Crane(线段树·向量旋转)

题意  有一个Crane由n条线段连接组成  每个连接点处均可以任意旋转  给你n条线段的长度  然后又m次旋转操作  给你p和r  将第p和第p+1条线段之间的角度旋转为r  即第p条线段绕p的终点逆时针旋转r度后能够与第p+1条重合  问每次旋转后最后一条线段的终点坐标 可以发现  旋转第p+1条线段时  p+1后面的所有线段也一起旋转了  可以把Crane分解为n个向量  这些向量

Deng's site \# 1066

信号完整性SI-PI

SI设计的主要难点在于需要综合信号的幅度、噪声、边沿、延时等影响信号质量的多种因素,并且这种因素常常相互依赖、互相影响,交叉在一起。1.1、信号过冲 (欠阻尼状态,可并联一个合适的电容):过冲会造成强烈的电磁干扰,另一方面会损伤后面的电路的输入及,甚至失效。信号完整性SI:是指电路系统中信号的质量,如果在要求的时间内,信号能不失真的从源端传输到接收端。优点:提供较慢的上升时间,减少反系量,产生更小的EMI,从而降低过冲,增加信号质量。导线之间的间距过小, 就会产生串扰,间距越小、串扰越大。

weixin_42304393的博客 4869

POJ 2991 Crane (线段树 维护旋转的向量和)

题目大意: 就是多个木棍初始摆在y轴上相邻的木棍间有连接着他们的东西, 相当于关节 然后每次操作旋转某个关节, 求旋转后的端点的坐标 大致思路: 首先将所有的木棍拆成多个向量, 那么考虑到向量的和v1 + v2 + ... + vk即为顶点的坐标, 并且多个向量的和旋转得到的角, 和这所有的向量都旋转同样的角再求和得到的向量是同样的 也就是说向量的旋转的时机不影响加法运算于是可以

Gatevin的专栏 625

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3793

算法 A 求稳健平均值和稳健标准差

文章目录算法原理代码 算法原理 算法 A 来自 GB/T 6379.5。应用此算法计算得到数据平均值和标准差的稳健值。稳健性是估计算法的特点,而不是其产生的估计值的特点,因此严格来说,称由此算法计算的平均值和标准差是稳健的是不确切的。然而,为避免使用繁琐的术语,“稳健均值”和“稳健标准差”应理解为利用稳健算法计算的总体均值和总体标准差的均值估计。 设数据为 xi,i∈(1,2,⋯ ,n)x_i, i\in(1,2,\cdots,n)xi​,i∈(1,2,⋯,n),记稳健平均值为 x∗,s∗x^*, s^*x

zhuo木鸟的博客 9254

工业级隔离SPI通信设计:MAX14431BAEE+与TM4C129ENCPDT实战

数字隔离器在工业嵌入式系统中用于解决地电位差和共模干扰问题,其原理是通过电容隔离技术实现信号跨隔离栅传输,同时切断地环路。相比传统光耦,数字隔离器具有低传播延迟、高共模瞬态抗扰度和低功耗等优势,技术价值在于提升通信可靠性和安全性。典型应用场景包括工业数据采集、电机驱动和PLC扩展模块等。在SPI通信中,隔离器引入的传播延迟会压缩时序余量,需精确计算建立/保持时间。本文以MAX14431BAEE+和TM4C129ENCPDT为例,详细解析隔离SPI链路的选型、时序计算、PCB布局及固件实现,帮助开发者构建稳定

aofan9566的博客 451

ARM架构下的SLAM部署避坑指南:香橙派AIpro与D435i深度相机的实战解析

本文详细解析了在ARM架构的香橙派AIpro开发板上部署SLAM算法并与Intel D435i深度相机配合的实战经验。内容涵盖系统配置、ROS编译、驱动安装、算法优化等关键步骤,提供了具体的避坑指南和性能调优技巧,帮助开发者在嵌入式平台上高效实现实时SLAM应用。

f0g1h2的博客 982

poj 2991 Crane(向量旋转+线段树成段更新)

Crane Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1609   Accepted: 416   Special Judge Description ACM has bought a new crane (crane -- jeřáb) . The

志当存高远 998

【AI深究】合成数据(Synthetic Data)深度解析:原理、算法与工程实践——全网最详细流程|核心原理、主流方法、数学表达、工程实践与细节、未来趋势|GAN、VAE、语言模型LLM合成如GPT

大家好,我是爱酱。本篇延续将会系统梳理合成数据(Synthetic Data)的核心原理、主流方法、数学表达、工程实践与未来趋势,结合数学公式,帮助你全面理解这一AI建模的关键技术。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 4923

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 673

POJ 2991 Crane 线段树 向量的旋转变换

题意:许多条线段首尾相连(初始都在y轴上,第一条线段的一个端点在(0,0)),每一次操作可以将两条相邻线段间的夹角置为a度,输出每次操作后最后一条线段的端点坐标。 例如s是线段AB,s+1是线段BC,那么就是要把角ABC置为a度(逆时针方向)。 把每条线段都看成一个向量,则最后的端点就是全部向量的和,每次更新就把[s+1,n]之间的向量旋转某个角度b。这个角度b可以由目前s的角度,s+1...

weixin_34318326的博客 124

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

Robot_PLC_HMI_Automation 8611

POJ 2991 Crane(线段树:维护向量+计算几何)

POJ 2991 Crane(向量旋转+线段树_成段更新) 分析:        首先一个向量(x,y)逆时针绕起点旋转rad度后得到的向量为: newx = x*cos(rad)-y*sin(rad)   newy = x*sin(rad)+y*cos(rad) 然后我们要知道另外一个事实:如果一条折线由多个向量构成,那么这条折线段的终点坐标一定为起点+向量1+向量2+..+向量n的结果

code 1756

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

POJ 2991 Crane

二次联通门 : POJ 2991 Crane /* POJ 2991 Crane 线段树维护向量 对于每次修改操作 修改x的角度 就是修改x~N区间的所有向量 打个标记记录角度 当前向量的计算式子为 res为度数 x = tre...

weixin_30871701的博客 81

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

POJ 2991 Crane 【线段树】【向量旋转】

ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of various lengths, connected by flexible joints. The end of the i-th segment is joined to the beginning of the i + 1-th ...

Head_Hard的博客 324

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

挑战程序竞赛系列(33):POJ 2991 Crane

挑战程序竞赛系列(33):POJ 2991 Crane* 详细代码可以fork下Github上leetcode项目,不定期更新。 练习题如下: POJ 2991: Crane POJ 2991: Crane一道线段树题,在《挑战》中刷到了,就和之前理解的线段树拿来对比下,关于线段树可以参看【算法细节系列(28):线段树】。先来分析下题目,对于每个线段的更新,我们的目的在于记录终点的位置,此题的一

Demon-初来驾到 935

POJ2991 Crane(线段树成段更新+向量旋转)

DescriptionACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of various lengths, connected by flexible joints. The end of the i-th segment is joined to the beginning of the

_ostreamBaba 491

POJ2991_Crane_计算几何::向量化|向量旋转公式||线段树维护向量和

Crane Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6704   Accepted: 1801   Special Judge Description ACM has bought a new crane (crane -- jeřáb) . The

弱的奋斗之旅 795

转载POJ2991中涉及的数学基础向量旋转

POJ2991 Crane(线段树成段更新+向量旋转) - 软件开发其他 - 红黑联盟 https://www.2cto.com/kf/201610/556382.html 其他请参见《挑战程序设计竞赛》3.3.1.7

huaiyingdetective的博客 242

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

POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂。有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树。把每一段当成一个向量,这样每一段的坐标就等于前几段的坐标和,然后每次旋转的时候,相当于把当前到最后位置所有加上一个角度,这样就须要区间改动了。然后每次还须要查询s,和s + 1当前的...

weixin_34377065的博客 79

POJ 2991 Crane(线段树 + 一个数学公式)

题目链接:http://poj.org/problem?id=2991 解题思路: 题意是n根棍子,初始连接成一条直线,沿着y轴正方向放,每次操作是将指定两根棍子之间的夹角变成对应度数。 每次询问最后棍子的末端在坐标轴上的位置。 线段树思路: [A,B]维护第A到第B个棍子的向量(这个向量是平移到原点计算的) 每次修改x这个位置的角度,那么就修改[x+1,n] 于是, 区间合并...

shadiao.的博客 408

POJ 2991 Crane 线段树

题目链接:http://poj.org/problem?id=2991 挑战程序设计竞赛书上的例题。书上的思路还是蛮巧妙的,第一遍看真的没怎么看太懂,今天算是终于弄懂了。 稍微思考即可想到如果都用向量表示的话实际上就是从s+1到n的区间更新了,每个向量都旋转一定角度最后终点坐标实际上是全部向量的和。因此可以使用线段树进行区间更新。 书上更新的时候实际上是----对于包含了s的区间更...

EricJeffrey的博客 244

POJ 2991 - Crane

Advanced Data Structures :: Segment Tree   Description 有一个机械臂,想象它以直角坐标系的原点为轴,一节连着一节,最末端为机械手。 你可以旋转任意一个关节,改变机械手的位置。 (有点像《cut the rope》中的机械臂?没错,就是那么个玩意) 而现在要做的就正是这么一件事。 告诉你机械臂每节手臂的长度,不停得去操作它(旋转某个

A Code Rabbit 2074

poj 2991 Crane(线段树)

题目链接:poj 2991 Crane 题目大意:就是有一个机械手臂,有n结,给定每节的长度,一开始为垂直的。有m次操作,每次将x关节变成角度d,并且输出手臂末端的坐标。 解题思路:点的旋转公式(r为逆时针的角度): x′=x∗cos(r)−y∗sin(r)y′=x∗sin(r)+y∗cos(r) 没有做过类似的题目,线段树每个节点记录的为每节旋转的角度以及单节末端的位置。

不慌不忙、不急不躁 1210

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

由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每一次操作都要询问一次么? 那么懒惰标记还有用么? 如果使用懒惰标记, 将一些线段视为整体, 那么这些线段岂不是又要用一个线段树记录一段区间的总长? 树状数组亦可...) 将向量视为数量整体加和, 融入到线段树的操作中, 就可以避免角度和坐标分离的麻烦事.. 对线段树的求和理念理解不深, 只是想到了角度的加和, 殊不知向量本身也可以加和, 而且"和向量"与"分向量"的关系是层层细分下去的. 有了这样的思维框架

以中有足乐者... 1890
上一篇: uva11865 - Stream My Contest 最小树形图+二分
下一篇: Codeforces Round #136 (Div. 2) D. Little Elephant and Array 线段树 离线处理
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值