题目链接:https://vjudge.net/problem/POJ-2991

知识准备:

1、向量旋转公式:向量(x,y)逆时针旋转角度A,则旋转后的向量为(x*cos A-y*sin A, x*sin A+y*cos A).

详见:https://www.zybang.com/question/143ceaa20d3942f3c6dbe9415dd81d0a.html

2、PI可用这一行代码取得:

const double PI=acos(-1.0);

解题思路:思路来源于:http://www.cnblogs.com/staginner/archive/2012/04/07/2436436.html。

在此处 struct point pt[rt] 是rt对应的向量的坐标。

以结点间的向量为基础建立线段树。

第48行,if()里面的判断条件是个易错点,一开始没有把l-1,所以错了。

这是一道好题,值得重复做。

AC代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=+;
const double PI=acos(-1.0);
int totlen[maxn],len[maxn],degree[maxn];
int rd[maxn<<];
int n,c;
struct point{
double x,y;
}pt[maxn<<];
double getrad(int a){
return (double)a/*PI;
}
void Rotate(double &dx,double &dy,double rad){
double x=dx,y=dy;
dx=x*cos(rad)-y*sin(rad);
dy=x*sin(rad)+y*cos(rad);
}
void pushup(int rt){
pt[rt].x=pt[rt<<].x+pt[rt<<|].x;
pt[rt].y=pt[rt<<].y+pt[rt<<|].y;
}
void pushdown(int rt){
if(rd[rt]){
double rad=getrad(rd[rt]);
rd[rt<<]+=rd[rt];
rd[rt<<|]+=rd[rt];
Rotate(pt[rt<<].x,pt[rt<<].y,rad);
Rotate(pt[rt<<|].x,pt[rt<<|].y,rad);
rd[rt]=;
}
}
void build(int l,int r,int rt){
rd[rt]=;
pt[rt].x=; pt[rt].y=totlen[r]-totlen[l-];
// printf("build: l = %d, r = %d, pt[%d].x = %lf, pt[%d].y = %lf\n",l,r,rt,pt[rt].x,rt,pt[rt].y);
if(l==r) return;
int m=(l+r)>>;
build(lson);
build(rson);
}
void update(int L,int R,int delta,int l,int r,int rt){
if(L<=l-&&r<=R){
double rad=getrad(delta);
Rotate(pt[rt].x,pt[rt].y,rad);
rd[rt]+=delta;
// printf("l = %d, r = %d, pt[%d].x = %lf,pt[%d].y = %lf\n",l,r,rt,pt[rt].x,rt,pt[rt].y);
return;
}
if(l==r) return;
pushdown(rt);
int m=(l+r)>>;
if(L<=m) update(L,R,delta,lson);
if(m<R) update(L,R,delta,rson);
pushup(rt);
}
int main(){ while(scanf("%d%d",&n,&c)==){
int s,a;
for(int i=;i<=n;i++){
scanf("%d",&len[i]);
totlen[i]=totlen[i-]+len[i];
}
build(,n,); //_______________________
for(int i=;i<=n;i++) degree[i]=;
while(c--){
scanf("%d%d",&s,&a);
a-=;
int delta=a-degree[s];
degree[s]=a;
update(s,n,delta,,n,);
printf("%.2lf %.2lf\n",pt[].x,pt[].y);
}
printf("\n");
}
return ;
}

POJ2991的更多相关文章

  1. POJ-2991 Crane(区间更新+向量旋转)

    题目大意:n个向量首尾相连,每次操作使某个区间中的所有向量都旋转同样的角度.每次操作后都回答最后一个向量的坐标. 题目分析:区间维护向量信息.向量旋转:x1=x0*cos(t)-y0*sin(t),y ...

  2. poj2991 Crane(线段树+集合)白书例题

    题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...

  3. poj2991 Crane(线段树)

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

  4. poj2991 Crane

    思路: 线段树每个节点维护第一条线段起点指向最后一条线段终点的向量,于是每一个操作都是一次区间更新.使用成段更新的线段树即可.实现: #include <cstdio> #include ...

  5. 【27.22%】【poj2991】Crane

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5772   Accepted: 1571   Special Judge D ...

  6. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  7. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  8. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  9. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

随机推荐

  1. Galera将死——MySQL Group Replication正式发布

    2016-12-14 来源:InsideMySQL 作者:姜承尧 MySQL Group Replication GA 很多同学表示昨天的从你的全世界路过画风不对,好在今天MySQL界终于有大事情发生 ...

  2. 面试题总结-Java部分

    1 集合 1.1 hashmap原理 HashMap是基于哈希表实现的,每一个元素是一个key-value对,实现了Serializable.Cloneable接口,允许使用null值和null键.不 ...

  3. postman的使用概览

    本文主要描述postman的功能与使用方法Postman是404大厂的基于javascript语言完成的一款超级强大的插件,名字也很亲近(邮递员).可以用于做API请求测试.前端后台测试使用Postm ...

  4. INTERVIEW #1

    一.数据对齐存储 在32位系统中:int占4Bytes,short占2Bytes,char占1Byte,加起来应该是7Bytes,但是下面这段代码输出却是8. #define _CRT_SECURE_ ...

  5. MySQL如何安装-教程

    1.先从官网上下载Mysql压缩包https://dev.mysql.com/downloads/mysql/2.解压出来的mysql压缩包是没有图片中的data文件夹和my.ini 如图所示: 3. ...

  6. python——append后的列表为什么打印出来为空

    关于python 列表append的用法: list = [] list = list.append("c") print(list) >>>None 正确写法应 ...

  7. Java——多线程锁的那些事

    引入 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. 下面先带大家来总体预览一下锁的分类图 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了 ...

  8. 软件——Jira是什么

    JIRA这个工具接触有好几年了,在多个海外项目上都用过这个工具.去年又在项目上深度使用后就有点爱不释手了,回国后也在找机会推荐给其它项目上用.最近正好有新项目需要用,借这个机会把JIRA的配置学习的过 ...

  9. A. Guest From the Past(数学推式子)

    \(n元,买塑料杯子a元,买玻璃杯子b元,但玻璃杯子用完后可以卖c元\) \(求最多买的杯子.\) \(---------------------------分割------------------- ...

  10. Markdown更改字体、颜色、大小,设置文字背景色,调整图片大小设置居中,插入表格等方法

    Markdown 通过简单标记语法,使普通文本内容具有一定格式.但它本身不支持修改字体.字号与颜色等功能的. 一.更改字体大小.颜色.更改字体 Markdown语法 <font face=&qu ...