poj2991 Crane
思路:
线段树每个节点维护第一条线段起点指向最后一条线段终点的向量,于是每一个操作都是一次区间更新。使用成段更新的线段树即可。
实现:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring> using namespace std; const int MAXN = ;
const double PI = acos(-1.0); int a[MAXN], d[MAXN], n, c;
struct node
{
double x, y;
int lazy;
};
node tree[MAXN << ];
double trans(int d) { return (double)d * PI / 180.0; }
void rotate(double & x, double & y, int dx)
{
double tx = x * cos(trans(dx)) - y * sin(trans(dx));
double ty = y * cos(trans(dx)) + x * sin(trans(dx));
x = tx; y = ty;
}
void pushdown(int num)
{
if (!tree[num].lazy) return;
int tmp = tree[num].lazy;
rotate(tree[num << ].x, tree[num << ].y, tmp);
rotate(tree[num << | ].x, tree[num << | ].y, tmp);
tree[num << ].lazy += tmp;
tree[num << | ].lazy += tmp;
tree[num].lazy = ;
}
void pushup(int num)
{
tree[num].x = tree[num << ].x + tree[num << | ].x;
tree[num].y = tree[num << ].y + tree[num << | ].y;
}
void build(int num, int l, int r)
{
if (l == r) { tree[num].y = a[r]; return; }
int m = l + r >> ;
build(num << , l, m);
build(num << | , m + , r);
pushup(num);
}
void update(int num, int l, int r, int x, int y, int dx)
{
if (x <= l && y >= r)
{
rotate(tree[num].x, tree[num].y, dx);
tree[num].lazy += dx;
return;
}
int m = l + r >> ;
pushdown(num);
if (x <= m) update(num << , l, m, x, y, dx);
if (y >= m + ) update(num << | , m + , r, x, y, dx);
pushup(num);
} int main()
{
while (scanf("%d %d", &n, &c) != EOF)
{
for (int i = ; i <= n * ; i++) { tree[i].x = tree[i].y = ; tree[i].lazy = ; }
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
for (int i = ; i < n; i++) d[i] = ;
build(, , n);
int x, y;
for (int i = ; i < c; i++)
{
scanf("%d %d", &x, &y);
int dx = y - d[x];
d[x] = y;
update(, , n, x + , n, dx);
printf("%.2f %.2f\n", tree[].x, tree[].y);
}
puts("");
}
return ;
}
poj2991 Crane的更多相关文章
- poj2991 Crane(线段树)
Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...
- POJ-2991 Crane(区间更新+向量旋转)
题目大意:n个向量首尾相连,每次操作使某个区间中的所有向量都旋转同样的角度.每次操作后都回答最后一个向量的坐标. 题目分析:区间维护向量信息.向量旋转:x1=x0*cos(t)-y0*sin(t),y ...
- poj2991 Crane(线段树+集合)白书例题
题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...
- 线段树总结 (转载 里面有扫描线类 还有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打广告,但是现在我自己都不太好意思去看那篇文 ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...
- 【转载】完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...
随机推荐
- 【iOS系列】-触摸事件与手势识别
[iOS系列]-触摸事件与手势识别 第一:触摸事件 一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 UIEvent:称为事件对象,记录事件产生的时刻和类型 两根手指同时触摸一个view ...
- 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) D.Dinner Bet 概率DP+排列组合
题目链接:点这里 题意: 1~N标号的球 现在A有C个,B有C个 每次可以随机得到D个不同的球(1~N);问你A或B中的C个球都出现一次的 期望次数 题解: dp[i][j][k]表示 随机出现了i个 ...
- linux epoll的实现原理
1 linux的poll操作 linux文件的poll操作有两个主要目的:第一,主动查看该文件上是否有读写事件:第二,提供操作waitqueue的接口给epoll等上层接口使用,比如epoll可以通过 ...
- HttpServlet容器响应Web客户流程
HttpServlet容器响应Web客户请求流程如下: 1)Web客户向Servlet容器发出Http请求: 2)Servlet容器解析Web客户的Http请求: 3)Servlet容器创建一个Htt ...
- 创建GitHub技术博客全攻略【转】
本文转载自:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比 ...
- I.MX6Q MfgTool2 ucl2.xml eMMC
/**************************************************************************** * I.MX6Q MfgTool2 ucl2 ...
- AutoIT: 处理GridView控件的一些折中方法
一般情况下,Gridview是无法通过AutoIT Window Info来获取控件信息的,但是可以有折中的办法对Gridview中的字段赋值. #include<array.au3> $ ...
- django flask缓存memcache的key生成方法介绍
去年的一个django项目中,使用了memcache作为系统缓存,并实现多台机器上的缓存共享.配置的cache如下图所示: 最近在项目调试过程中,发现memcache在进行缓存时,使用的key并不是实 ...
- HashMap最大容量为什么是2的32次方
123456观察jdk中HashMap的源码,我们知道极限值为2的31次方. void resize(int newCapacity) { Entry[] oldTable = table; int ...
- vue 使用过程中自己遇到的bug
需要安装npm git(windows系统需要安装) npm 是node的包管理工具 npm 国内的网站比较慢,推荐使用cnpm(淘宝的镜像) cnpm(npm) install 创建依赖-----因 ...