Crane

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\n",vx[1],vy[1]);
        }
    }
}
posted @ 2020-02-08 16:20  caoanda  阅读(285)  评论(0编辑  收藏  举报