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打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- java之 惰性初始化
class Soap { private String s; Soap(){ System.out.println("Soap()"); s="Constructed&q ...
- npm小工具、技巧合集:让你的npm“健步如飞”
1.解决安装速度慢问题-nrm 解决痛点 由于npm的包仓库是在国外,npm包安装速度较慢,部分包甚至无法安装. 对比cnpm的优势 1.cnpm增加了大脑的记忆和思维负担,常常需要考虑使用npm还是 ...
- Xapian实战(二):core concepts
参考资料 core concepts 正文 1. 并发性 xapian不包含任何全局变量,所以多线程编程中,在没有共享资源的情况下可以安全使用xapian.在实际操作中,由于每个线程都可以创建自己的x ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest A. Copying Homework (思维)
Danang and Darto are classmates. They are given homework to create a permutation of N integers from ...
- jquery 根据后端传过来的value值,让小原点根据不同值区间去左右定位
/** * 小圆点滑动 * @param {目标dom} barEle * @param {最小值} min * @param {最大值} max * @param {dom总长度} domLang ...
- FMT/FWT学习笔记
目录 FMT/FWT学习笔记 FMT 快速莫比乌斯变换 OR卷积 AND卷积 快速沃尔什变换(FWT/XOR卷积) FMT/FWT学习笔记 FMT/FWT是算法竞赛中求or/and/xor卷积的算法, ...
- opencv基于PCA降维算法的人脸识别
opencv基于PCA降维算法的人脸识别(att_faces) 一.数据提取与处理 # 导入所需模块 import matplotlib.pyplot as plt import numpy as n ...
- 万盛酒店餐饮管理系统(SpringBoot,SSM,MySQL )
项目源码获取地址: 链接:https://pan.baidu.com/s/1ip0keQruE2crA8vm1n8ZXQ 提取码:kivb 复制这段内容后打开百度网盘手机App,操作更方便哦 [功能包 ...
- JS实现手机号码中间4位变星号
这个问题,我们可以用截取字符串解决,以下我列出2种方法,小伙伴们可以根据自己的需要选择哦: ● 1,substring()方法用于提取字符串中介于两个指定下标之间的字符. '; //该号码是乱打出来的 ...
- 阿里面试居然跟我扯了半小时的CyclicBarrier
一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满Logo的Mac向我走来,看着稀少的头发,我心想着肯定是顶级技术大牛吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:您好,先做一下自我介绍吧! ...