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;
}
时间: 2024-12-13 10:14:14

AC日记——Crane poj 2991的相关文章

AC日记——Dividing poj 1014

Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 69575   Accepted: 18138 Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbl

AC日记——Oulipo poj 3461

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37958   Accepted: 15282 Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from

AC日记——Dining poj 3281

[POJ-3281] 思路: 把牛拆点: s向食物连边,流量1: 饮料向t连边,流量1: 食物向牛1连边,流量1: 牛2向饮料连边,流量1: 最大流: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 2005 #define INF 0x7fffffff int n,f,

POJ 2991 Crane

二次联通门 : POJ 2991 Crane /* POJ 2991 Crane 线段树维护向量 对于每次修改操作 修改x的角度 就是修改x~N区间的所有向量 打个标记记录角度 当前向量的计算式子为 res为度数 x = tree[now].x * cos (res) - tree[now].y * sin (res); y = tree[now].x * sin (res) + tree[now].y * cos (res); 注意弧度制与角度值的互换 注意还要记录一下上次该向量的角度, 即a

poj 2991 Crane(线段树)

题目链接:poj 2991 Crane 题目大意:就是有一个机械手臂,有n结,给定每节的长度,一开始为垂直的.有m次操作,每次将x关节变成角度d,并且输出手臂末端的坐标. 解题思路:点的旋转公式(r为逆时针的角度): x′=x?cos(r)?y?sin(r) y′=x?sin(r)+y?cos(r) 没有做过类似的题目,线段树每个节点记录的为每节旋转的角度以及单节末端的位置.每次旋转新的角度,需要根据前一个节点的角度和当前节点的角度来计算(因为它不是再旋转d,而是变成角度d #include <

POJ - 2991 Crane (线段树+计算几何)

Description ACM has bought a new crane (crane -- je?áb) . The crane consists of n segments of various lengths, connected by flexible joints. The end of the i-th segment is joined to the beginning of the i + 1-th one, for 1 ≤ i < n. The beginning of t

POJ 2991 Crane(线段树+计算几何)

POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂,有n段,现在每次操作可以旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树,把每一段当成一个向量,这样每一段的坐标就等于前几段的坐标和,然后每次旋转的时候,相当于把当前到最后位置全部加上一个角度,这样就需要区间修改了,然后每次还需要查询s,和s + 1当前的角度,所以需要单点查询,这样用线段树去维护即可 代码: #include <cstdio> #include <cstri

AC日记——Aragorn&#39;s Story HDU 3966

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10510    Accepted Submission(s): 2766 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

转载::POJ 2991 线段树+计算几何(有c++结构体操作)

POJ 2991 线段树+计算几何 (2011-02-27 21:13:44) 转载▼ 标签: 杂谈 分类: OI 话说这一题真的是很恶心很恶心,不过确实改变了我对线段树的一些看法,算是很经典的题目. 题意:有一个吊车由很多个不同长度的线段组成,一开始是一条长直线起点在(0,0),尾节点在(0,sum[n]),每条线段之间的夹角的初始值是180度.然后有一些操作a. b将第a条线段和a+1之间的夹角变成b度,经过每一次操作都要求出尾节点的坐标. 首先要用到一个计算几何的知识(没学过..请教而来)