AC日记——Crane poj 2991

Posted Only U - IU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC日记——Crane poj 2991相关的知识,希望对你有一定的参考价值。

POJ - 2991

 

 

思路:

  向量旋转;

 

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 400005

const double pi=acos(-1.0);

struct TreeNodeType {
    int l,r,R,mid,flag;
    
    double x,y;
    
    void mem()
    {
        x=0,R=180;
        scanf("%lf",&y);
    }
    
    void rotate(int R__)
    {
        double tmp_x=x,tmp_y=y,R_=R__/180.0*pi;
        x=tmp_x*cos(R_)-tmp_y*sin(R_);
        y=tmp_y*cos(R_)+tmp_x*sin(R_);
    }
};
struct TreeNodeType tree[maxn<<2];

int n,m;

void build(int now,int l,int r)
{
    tree[now].l=l,tree[now].r=r,tree[now].flag=0;
    if(tree[now].l==tree[now].r) { tree[now].mem();return; }
    tree[now].mid=l+r>>1;build(now<<1,l,tree[now].mid),build(now<<1|1,tree[now].mid+1,r);
    tree[now].x=tree[now<<1].x+tree[now<<1|1].x,tree[now].y=tree[now<<1].y+tree[now<<1|1].y;
}

int query(int now,int to,int x)
{
    if(tree[now].l==tree[now].r){int pos=x-tree[now].R;tree[now].R=x;return pos;}
    if(to<=tree[now].mid) return query(now<<1,to,x);else return query(now<<1|1,to,x);
}

void updata(int now)
{
    tree[now<<1].flag+=tree[now].flag,tree[now<<1|1].flag+=tree[now].flag;
    tree[now<<1].rotate(tree[now].flag),tree[now<<1|1].rotate(tree[now].flag);
    tree[now].flag=0;
}

void change(int now,int l,int r,int x)
{
    if(tree[now].l==l&&tree[now].r==r) {tree[now].flag+=x,tree[now].rotate(x);return;}
    if(tree[now].flag) updata(now);if(l>tree[now].mid) change(now<<1|1,l,r,x);
    else if(r<=tree[now].mid) change(now<<1,l,r,x);
    else change(now<<1,l,tree[now].mid,x),change(now<<1|1,tree[now].mid+1,r,x);
     tree[now].x=tree[now<<1].x+tree[now<<1|1].x,tree[now].y=tree[now<<1].y+tree[now<<1|1].y;
}

int main()
{
    int T=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(T++) printf("\n");
        build(1,1,n);int to,x;
        for(;m--;)
        {
            scanf("%d%d",&to,&x);
            change(1,to+1,n,query(1,to+1,x));
            printf("%.2lf %.2lf\n",tree[1].x,tree[1].y);
        }
    }
    return 0;
}

 

以上是关于AC日记——Crane poj 2991的主要内容,如果未能解决你的问题,请参考以下文章

poj2991 Crane(线段树)

POJ 2991 Crane

poj2991 Crane

挑战程序设计竞赛3.3例题:Crane POJ - 2991

POJ2991

AC日记——Dividing poj 1014