POJ2991
题目链接: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的更多相关文章
- POJ-2991 Crane(区间更新+向量旋转)
题目大意:n个向量首尾相连,每次操作使某个区间中的所有向量都旋转同样的角度.每次操作后都回答最后一个向量的坐标. 题目分析:区间维护向量信息.向量旋转:x1=x0*cos(t)-y0*sin(t),y ...
- poj2991 Crane(线段树+集合)白书例题
题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...
- poj2991 Crane(线段树)
Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...
- poj2991 Crane
思路: 线段树每个节点维护第一条线段起点指向最后一条线段终点的向量,于是每一个操作都是一次区间更新.使用成段更新的线段树即可.实现: #include <cstdio> #include ...
- 【27.22%】【poj2991】Crane
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5772 Accepted: 1571 Special Judge D ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- 《完全版线段树》——notonlysuccess
转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- Golang Context 的原理与实战
本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...
- 图像处理之OpenCV - 缩放/旋转/裁剪/加噪声/高斯模糊
Github地址 @ 缩放 void cv::resize ( InputArray src, OutputArray dst, Size dsize, , , int interpolation = ...
- Simple Math Problems
整理下<算法笔记>,方便查看. 一.最大公约数&最小公倍数 欧几里得定理:设a,b均为正整数,那么gcd(a,b)=gcd(b,a%b). 若,定理就先交换a和b. 注意:0和任意 ...
- 数学--数论--HDU 1792 A New Change Problem (GCD+打表找规律)
Problem Description Now given two kinds of coins A and B,which satisfy that GCD(A,B)=1.Here you can ...
- String(字符串) 比较大小 如果有A+B>B+A 则A>B
题目引入: 给定N个整数,那任意顺序排列连成一个数,得到的最大的数是多少? 分析:贪心,字典序排序,都不对大小比较也不对,今天我跟别人想了很久绞尽脑汁,各种模拟都失败了.最后才发现对于俩个数a=313 ...
- Git上传本地仓库项目到gitee远程仓库(命令篇)
前言:最近整理了一下自己之前的自学代码,包括一些练习的项目.发现有些杂乱,故想使用Gitte(码云)管理.加上不少公司使用Git,所以写了这篇文章记录. 如果我们本地有了项目,那么如何上传到码云上呢? ...
- 两个命令把 Vim 打造成 Python IDE
运行下面两个命令,即可把 Vim(含插件)配置成 Python IDE.目前支持 MAC 和 Ubuntu. Shell curl -O https://raw.githubusercontent ...
- springboot rabbitmq 找不到队列
错误报告: org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to ...
- libevent(二)尾队列 && 最小堆
本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \ st ...
- Unix的I/O模型
对于一次I/O操作(以read为例),数据首先被拷贝到内核的某个缓冲区,然后再从内核缓冲区拷贝到应用进程缓冲区. 因此,一次I/O操作通常包含两个阶段: (1) 等待数据准备好 (2) 从内核向进程复 ...