这道题是线段树加计算几何
先说计算几何,一个向量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;