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打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- 表达式求值--数据结构C语言算法实现
这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...
- POJ1077 八数码问题
题目:八数码 网址:http://poj.org/problem?id=1077 在一个3×3的网格中,1~8这8个数字和一个"X"恰好不重不漏地分布在这3×3的网格中. 例如: ...
- 跟风微信小程序,生鲜水果店如何借力小程序每天多赚2万块?
公司旁边的水果店,虽然是一家实体店,但老板有一颗爱玩互联网的心. 老板非常重视线上的营销推广,什么新的线上推广方式都爱尝试一下.公众号大热时做了自己的微信公众号,并且有自己的微信商城,不过线上的销售一 ...
- Microsoft Dynamics CRM 2015 服务器系统的性能维护,追踪, 也可以用到任务管理器哟...
Microsoft Dynamics CRM 2015 的追踪是一个很有用的function,它能为我们的CRM调试,评估 提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状态 ...
- HTML--HTML入门篇(我想10分钟入门HTML,可以,交给我吧)
我要正经的讲一节课,咳咳! HTML简介(废话) HTML称为超文本标记语言,是一种标识性的语言.它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整 ...
- Android 10 获取已连接上的蓝牙设备的当前电量
前言 最近的项目中有获取连接蓝牙设备电量的需求,查找了一些资料,发现谷歌在Android8.0推出了一个getBatteryLevel的api,用来获取蓝牙设备电量百分比的方法,但在我的项目中andr ...
- go 模板详说
模板是我们常用的手段用于动态生成页面,或者用于代码生成器的编写等.比如把数据库的表映射成go语言的struct,这些体力活,写个代码生成器是最合适不过的了. 示例例把表转成 struct : 当然这篇 ...
- turtle库应用实例3-叠加等边三角形绘制(一笔画)
叠加等边三角形绘制 ...
- http协议跟tcp协议的简单理解
在说明这两个协议之前,我们先简单说一下网络的分层. 1)应用层 支持网络应用,应用协议仅仅是网络应用的一个组成部分,运行在不同主机上的进程则使用应用层协议进行通信.主要的协议有:http.ftp.te ...
- 剑指offer--(根据前序遍历和中序遍历)重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...