Crane
Posted cadcadcad
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Crane相关的知识,希望对你有一定的参考价值。
因为这道题需要需要对数据进行多次修改以及多次查询,而且涉及区间修改,所以最高效的办法就是利用线段树对其进行优化。
// Created by CAD on 2020/2/8.
#include <cmath>
#include <cstdio>
#define lson (p<<1)
#define rson (p<<1|1)
#define PI 3.14159265358979323846
using namespace std;
const int maxn=10005;
int n,c;
int L[maxn];
double vx[maxn<<2],vy[maxn<<2],ang[maxn<<2];
double prv[maxn];
void build(int s, int t, int p){
ang[p]=vx[p]=0;
if(s==t) vy[p]=L[s];
else{
int mid=(s+t)>>1;
build(s,mid,lson),build(mid+1,t,rson);
vy[p]=vy[lson]+vy[rson];
}
}
void update(int x,double a,int s,int t,int p){
if(x<s) return ;
else if(x<t){
int mid=(s+t)>>1;
update(x,a,s,mid,lson),update(x,a,mid+1,t,rson);
if(x<=mid) ang[p]+=a;
double si=sin(ang[p]),co=cos(ang[p]);
vx[p]=vx[lson]+co*vx[rson]-si*vy[rson];
vy[p]=vy[lson]+si*vx[rson]+co*vy[rson];
}
}
int main(){
while(~scanf("%d%d",&n,&c)){
for(int i=1;i<=n;++i)
scanf("%d",&L[i]);
build(1,n,1);
for(int i=1;i<=n;++i)
prv[i]=PI;
while(c--){
int s;scanf("%d",&s);
double a;scanf("%lf",&a);
a=a/180.0*PI;
update(s,a-prv[s],1,n,1);
prv[s]=a;
printf("%.2f %.2f
",vx[1],vy[1]);
}
}
}
以上是关于Crane的主要内容,如果未能解决你的问题,请参考以下文章