POJ_2991 Crane

来源:互联网 发布:淘宝账户存在安全风险 编辑:程序博客网 时间:2024/05/18 00:21

这道题是线段树加计算几何

先说计算几何,一个向量A(a,b)逆时针旋转x度,所得的向量为B(a1,b2);

则,a1+i*b2 = (a+i*b)*(cosx + i* sinx);

可以得到a1 = a*cosx - b*sinx;

               b2 = a*sinx +

#include <iostream>#include <cmath>#include <math.h>#define _USE_MATH_DEFINES#define M_PI       3.14159265358979323846#include <cstdio>using namespace std;const int MAX_N = 10005;const int ST_SIZE = (1<<15)-1;int n,c;int L[MAX_N];int S[MAX_N];int A[MAX_N];double vx[ST_SIZE];double vy[ST_SIZE];double ang[ST_SIZE];double prv[MAX_N];void init(int k,int l,int r){    ang[k] = 0.0;    vx[k] = 0.0;    if(l == r-1)    {        vy[k] = L[l];        return ;    }    int chl = k*2+1;    int chr = k*2+2;    init(chl,l,(l+r)/2);    init(chr,(l+r)/2,r);    vy[k] = vy[chl] + vy[chr];}void change(int s,double a,int v,int l,int r){    if(s<=l)        return ;    else{        if(s<r)        {            int chl = v*2+1;            int chr = v*2+2;            int m = (l+r)/2;            change(s,a,chl,l,m);            change(s,a,chr,m,r);            if(s<=m)            {                ang[v] += a;            }            double s = sin(ang[v]);            double c = cos(ang[v]);            //计算几何,逆时针旋转v角度            vx[v] = vx[chl] + (c*vx[chr] - s*vy[chr]);            vy[v] = vy[chl] + (s*vx[chr] + c*vy[chr]);        }    }}void solve(){   // cout<<"ok"<<endl;    init(0,0,n);    //cout<<"ok"<<endl;    for(int i=1;i<=n;i++)    {        prv[i] = M_PI;    }    for(int i=0;i<c;i++)    {        int s = S[i];        double a = A[i]/360.0 * 2 * M_PI;        change(s,a-prv[s],0,0,n);        prv[s] = a;//更新角度        printf("%.2f %.2f\n",vx[0],vy[0]);//总是最上面的点的坐标    }}int main(){    freopen("POJ_2991.txt","r",stdin);    while(cin>>n>>c)    {        for(int i=0;i<n;i++)        {            cin>>L[i];        }        for(int i=0;i<c;i++)        {            cin>>S[i]>>A[i];        }        solve();    }}

b*cosx;

0 0
原创粉丝点击