poj 2991 线段树
2015-11-09 00:25
218 查看
#include <cstdio> #include <cstring> #include <iostream> #include <stack> #include <queue> #include <map> #include <algorithm> #include <vector> #include <cmath> #define pi 3.141592653 using namespace std; const int maxn = 40005; typedef long long LL; int N,C; int L[maxn]; int S[maxn],A[maxn]; double vx[maxn],vy[maxn]; double ang[maxn]; double pre[maxn]; void init(int l,int r,int rt) { ang[rt] = vx[rt] = 0.0; if(r - l == 1) { vy[rt] = L[l]; } else{ int lch = rt*2+1; int rch = rt*2+2; int mid = (r + l )/2; init(l,mid,lch); init(mid,r,rch); vy[rt] = vy[lch] + vy[rch]; } } void change(int s,double a,int rt,int l,int r) { if(s <= l) return ; else if(s < r){ int lch = rt*2+1; int rch = rt*2+2; int mid = (l + r)/2; change(s,a,lch,l,mid); change(s,a,rch,mid,r); if(s <= mid) ang[rt] += a; double t = sin(ang[rt]); double c = cos(ang[rt]); vx[rt] = vx[lch] + (c*vx[rch] - t*vy[rch]); vy[rt] = vy[lch] + (t*vx[rch] + c*vy[rch]); } } void solve() { init(0,N,0); for(int i=1;i<N;i++) pre[i] = pi; for(int i=0;i<C;i++){ int s = S[i]; double a = A[i]/360.0*2*pi; change(s,a-pre[s],0,0,N); pre[s] = a; printf("%.2f %.2f\n",vx[0],vy[0]); } } int main() { while(scanf("%d%d",&N,&C)!=EOF){ for(int i=0;i<N;i++){ scanf("%d",&L[i]); } for(int i=0;i<C;i++){ scanf("%d%d",&S[i],&A[i]); } solve(); } return 0; }
View Code
相关文章推荐
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- Window下的Git和GitHub简单总结
- java指令集
- iOS9 适配网络请求,适配分享失败,适配无法正常跳转到客户端
- 自控力
- 菜鸟日记之JSP二 内置对象的理解
- Spring MVC的RequestMapping的详解
- 用js进行日期的加减
- LNMP+Zbbix环境搭建
- Fiddler 显示服务器IP地址的方法 滚动刷新
- NumPy-快速处理数据--矩阵运算
- UGUI 过渡动画插件,模仿NGUI的Tween (转载)
- xcode iOS 模拟器 textField 鼠标点击后键盘不显示
- AOP--代理模式,拦截器的简易实现及原理
- 硬盘的分区和分区格式化类型详解
- Generate C and C++ Header File
- Redis异常调查
- 运用NDWI指数对高分1号进行水体提取--以matlab为例
- The Unordered List Abstract Data Type
- Spring的web容器的启动