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打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- nat和静态映射
拓扑图: 实验要求: 1.R2.R3能访问外网的4.4.4.4(4.4.4.4为R4上的环回接口,用来模拟inter网). 2.R4访问222.222.222.100其实访问到的是内网的192.168 ...
- R 语言命令行参数处理
在unix.windows外部需要调用R脚本执行,然后又需要输入不同的参数,类似shell脚本的命令行参数输入,可以使用Rcript命令实现. 命令格式:Rscript [options] [-e e ...
- Java自动装箱与缓存
自动装箱与缓存 现象 有以下代码: 1 public class Main { 2 public static void main(String[] args) { 3 Integer i1 = 12 ...
- CF1316C Primitive Primes
CF1316C [Primitive Primes] 给出两个多项式\(a_0+a_1x+a_2x^2+\dots +a_{n-1}x^{n-1}\)和\(b_0+b_1x+b_2x^2+ \dots ...
- 一只简单的网络爬虫(基于linux C/C++)————支持动态模块加载
插件在软件设计中有很大的好处,可以方便地扩展各种功能,使用插件技术能够在分析.设计.开发.项目计划.协作生产和产品扩展等很多方面带来好处: (1)结构清晰.易于理解.由于借鉴了硬件总线的结构,而且各个 ...
- springboot设置banner
下图是springboot项目启动的的打印数据,在log中可以清楚的看到有一个spring的banner图案,这个图案其实我们是可以自己进行设置的 我们在项目目录的resources目录下创建一个ba ...
- 06_CSS入门和高级技巧(4)
复习 CSS : 负责样式层,层叠式样式表cascading style sheet.CSS2.1,最新版本CSS3. CSS选择器: 选择哪些元素加样式.基本选择3种:标签p.id选择器#id.cl ...
- Qt线程池
说明 Qt中可以有多种使用线程的方式: 继承 QThread,重写 run() 接口: 使用 moveToThread() 方法将 QObject 子类移至线程中,内部的所有使用信号槽的槽函数均在线程 ...
- 【Scala】利用Akka的actor编程模型,实现2个进程间的通信
文章目录 步骤 一.创建maven工程,导入jar包 二.master进程代码开发 三.worker进程代码开发 四.控制台结果 步骤 一.创建maven工程,导入jar包 <propertie ...
- Git使用教程之从远程库克隆项目(四)
我们接下来在本地新建一个文件夹,把刚刚github上创建的项目克隆下来,操作步骤如下: 1.克隆项目: 找到github上面的SSH地址,如图: 开始克隆: $ git clone git@githu ...