码迷,mamicode.com
首页 > 其他好文 > 详细

Crane

时间:2020-02-08 17:26:58      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:name   created   define   href   多次   turn   ref   ret   const   

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]);
        }
    }
}

Crane

标签:name   created   define   href   多次   turn   ref   ret   const   

原文地址:https://www.cnblogs.com/CADCADCAD/p/12283794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!