线段树《挑程》书例POJ 2991

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<utility>
#include<vector>
#include<cstring>
#include<cmath>
#define INF 0x3fffffff
#define pb push_back
#define pn(x) cerr<<x<<endl

using namespace std;
typedef long long ll;
typedef pair<int,int> P;///num,pos
const int maxv=10005;

typedef pair<int,ll> node;
const double pi=acos(-1);
double L[maxv];
double ang[maxv*4],vx[maxv*4],vy[maxv*4];
double prv[maxv*4];
int N,C;
void init(int k,int l,int r){
    vx[k]=ang[k]=0;
    if(r-l==1){
        vy[k]=L[l];
        return;
    }
    else{
        int chl=k*2+1,chr=k*2+2;
        init(chl,l,(r+l)/2);
        init(chr,(r+l)/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,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]),c=cos(ang[v]);
        vx[v]=vx[chl]+(c*vx[chr]-s*vy[chr]);
        vy[v]=vy[chl]+(s*vx[chr]+c*vy[chr]);
    }
}
void solve(){
    init(0,0,N);
    for(int i=0;i<N;i++) prv[i]=pi;
    for(int i=0;i<C;i++){
        double a;
        int s;
        scanf("%d%lf",&s,&a);
        a=a/360.0*2*pi;
        change(s,a-prv[s],0,0,N);
        prv[s]=a;
        printf("%.2f %.2f\n",vx[0],vy[0]);
    }
}
int main(){
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    printf("%.10lf\n",acos(-1));
    while(cin>>N>>C){
        for(int i=0;i<N;i++) scanf("%lf",&L[i]);
        solve();
        puts("");
    }
    return 0;
}

 

posted @ 2015-05-04 13:25  PlusSeven  阅读(96)  评论(0)    收藏  举报