银河战舰

【问题描述】
    瑞奥和玛德利德是非常好的朋友。瑞奥平时的爱好是吹牛,玛德利德的爱好是戳穿瑞奥吹的牛。
    这天瑞奥和玛德利德来到了宇宙空间站,瑞奥向玛德利德炫耀这个空间站里所有的银河战舰都是自己的。整个空间站可以看成一个无限大的二维平面,而每个战舰都可以看做一个点,在空间站中一共分布着N艘银河战舰。
    玛德利德:“你说这些都是你的,那你让他们动一动啊”
瑞奥:“诶你看,那艘动了!”
    玛德利德:“操作指令由我来发,一共有5种动的方法……”
瑞奥:“我觉得这样有失公正……”
【输入格式】
第一行一个正整数N,表示战舰的数量
接下来N行,每行两个实数,代表第i个战舰的x,y坐标
然后一个正整数M,代表调度的次数
接下来M行操作,每个操作都是如下类型的一种:
M l r p q:把编号在[l,r]区间内的战舰x坐标加上p,y坐标加上q
X l r:把编号在[l,r]区间内的战舰沿x轴翻转
Y l r:把编号在[l,r]区间内的战舰沿y轴翻转
O l r:把编号在[l,r]区间内的战舰沿直线y=x翻转
R l r a:把编号在[l,r]区间内的战舰绕原点逆时针旋转a°
【输出格式】
输出包括N行,代表着N艘战舰经过M次调度之后的坐标(保留两位小数)
【样例输入】
3
1 2
-2 2.5
0 -3
3
X 1 3
M 1 3 3 6
R 1 3 90
【样例输出】
-4.00 4.00
-3.50 1.00
-9.00 3.00

用正常的线段树操作可以拿下M,X,Y,O操作大概是70分

但是R操作似乎无法实现

但此题我们发现它是离线的

那么只要有最后结果就行了

值得一提的是R操作(x,y)->(xcosa-ysina,xsina+ycosa)

用矩阵就可以了,转移矩阵:

cosa sina 0

-sina cosa 0

0      0       1

其实其他操作都可以用矩阵(上面矩阵不然为什么是3×3?)

假设状态(x,y,1),那么M操作转移矩阵:

1    0    0

0    1    0

p    q    1

1这个就是用来转移M操作的,那么其他操作也很简单了

用线段树维护矩阵标记,并下传就行了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Matrix
{
    double a[3][3];
    Matrix()
    {
        memset(a,0,sizeof(a));
        a[0][0]=1;a[1][1]=1;a[2][2]=1;
    }
}Mat,c[400001],st;
double x[100001],y[100001];
char s[10001];
int n,m;
 Matrix operator *(const Matrix &x,const Matrix &y)
  {
      Matrix res;
      int i,j,k;
      memset(res.a,0,sizeof(res.a));
      for (j=0;j<=2;j++)
      {
          for (k=0;k<=2;k++)
          if (y.a[k][j])
          {
              for (i=0;i<=2;i++)
              {
                  res.a[i][j]+=x.a[i][k]*y.a[k][j];
              }
          }
      }
      return res;
  }
void pushdown(int rt)
{
   c[rt*2]=c[rt*2]*c[rt];
    c[rt*2+1]=c[rt*2+1]*c[rt];
    c[rt]=st;
}
void update(int rt,int l,int r,int L,int R)
{
  if (l>=L&&r<=R)
  {
      c[rt]=c[rt]*Mat;
      return;
  }
    pushdown(rt);
    int mid=(l+r)/2;
    if (L<=mid) update(rt*2,l,mid,L,R);
    if (R>mid) update(rt*2+1,mid+1,r,L,R);
}
void dfs(int rt,int l,int r)
{
  if (l==r)
  {
       printf("%.2lf %.2lf\n",x[l]*c[rt].a[0][0]+y[l]*c[rt].a[1][0]+c[rt].a[2][0],y[l]*c[rt].a[1][1]+x[l]*c[rt].a[0][1]+c[rt].a[2][1]);
      return;
  }
    pushdown(rt);
    int mid=(l+r)/2;
    dfs(rt*2,l,mid);
    dfs(rt*2+1,mid+1,r);
}
int main()
{int i,j,l,r;
  double p,q,a;
   cin>>n;
    for (i=1;i<=n;i++)
    {
     scanf("%lf%lf",&x[i],&y[i]);
    }
    cin>>m;
     for (i=1;i<=m;i++)
     {
         scanf("%s",s);
         scanf("%d%d",&l,&r);
         if (s[0]==‘M‘)
         {
             scanf("%lf%lf",&p,&q);
             memset(Mat.a,0,sizeof(Mat.a));
             Mat.a[0][0]=1;Mat.a[2][0]=p;Mat.a[1][1]=1;Mat.a[2][1]=q;
             Mat.a[2][2]=1;
             update(1,1,n,l,r);
         }
        if (s[0]==‘X‘)
        {
             memset(Mat.a,0,sizeof(Mat.a));
            Mat.a[1][1]=-1;Mat.a[0][0]=1;Mat.a[2][2]=1;
             update(1,1,n,l,r);
        }
         if (s[0]==‘Y‘)
         {
             memset(Mat.a,0,sizeof(Mat.a));
            Mat.a[1][1]=1;Mat.a[0][0]=-1;Mat.a[2][2]=1;
             update(1,1,n,l,r);
         }
         if (s[0]==‘O‘)
         {
             memset(Mat.a,0,sizeof(Mat.a));
            Mat.a[1][0]=1;Mat.a[0][1]=1;Mat.a[2][2]=1;
             update(1,1,n,l,r);
         }
         if (s[0]==‘R‘)
         {
             memset(Mat.a,0,sizeof(Mat.a));
             scanf("%lf",&a);
             Mat.a[0][0]=Mat.a[1][1]=cos(a*acos(-1)/180);
             Mat.a[0][1]=sin(a*acos(-1)/180);
             Mat.a[1][0]=-sin(a*acos(-1)/180);
             Mat.a[2][2]=1;
             update(1,1,n,l,r);
         }
     }
    dfs(1,1,n);
}
时间: 2024-08-29 20:50:09

银河战舰的相关文章

并查集 专题 之 银河战舰的奇妙距离

看题目就知道这是NOI2002的Galaxy——银河英雄传说 题目如下: 银河英雄传说 描述 Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨 威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩

【2016北京集训】银河战舰

Portal --> broken qwq Description 给你一棵树,每个节点有一个权值,求树上最长的一条链上的最长上升子序列长度 数据范围:\(2<=n<=200000,1<=val<=10^6\),其中\(val\)表示点权 Solution 深陷点分无法自拔论我的头里面都装了些什么== 大家好我是一个失去脑子的点分+线段树选手== ? 这题的话..首先一个前置技能是nlogn子序列,然后我们只要把这个玩意搬到树上就好了 ? 注意到假设答案过一个点\(x\),那

记录 [补档]

数学 概率论 计数问题 数论 线性代数 博弈论 比赛经验 不要通过数据大小猜测正解的时间复杂度. 把一个方法想到底. DP题假如实在不会的话, 果断跳过, 找思维量更小的数据结构题. 一些方法 二分 DP, 尤其多想矩阵乘法优化DP 网络流 FFT 日程表 Fri, Nov 10 明天就是NOIp了. 从上次记录到现在已经将近一个月了, 这个月, 真心没有进步多少, 完全不再状态. 希望不要AFO吧. 这可能是最后一篇记录了. Sun, Oct 22 AHOI 2009 中国象棋: 统计在棋盘上

七年一冠、IG牛13的背后是什么!

最近忙着看S8世界总决赛,博客荒废了近一个月,后续步入正轨. 2018年11月3日.S8世界总决赛.中国终于夺得了S系列赛的总冠军. “IG牛逼”也开始刷爆社交圈,对于在S3入坑的我来说,也弥补上了遗憾. IG夺冠本是一件非常值得庆祝的一件事情,但是官微在IG夺冠后一直将宣传重心放在卖KDA女团皮肤上,IG夺冠好像完全不值得庆祝(策划脑子进水). 同时国服客户端的操作也很“睿智”,夺冠三天后,国服客户端还在卖KDA皮肤,整个界面一片KDA女团的身影. 腾讯的敷衍激怒了王思聪,微博上王思聪开始怒腾

[noi2002]银河英雄传说

Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.        宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌.        杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 3000

VijosP1443:银河英雄传说

描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后,他把自己的战舰也依次编号为1, 2,

codevs1540 银河英雄传说

描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000.之后,他把自己的战舰也依次编号为1, 2,

中国军队在用银河麒麟,那美国军队在用什么操作系统呢?

Solaris 10 11/06 这个礼拜公布啦,这次的Update包括了两个很重要的特性:Logical Domains和 Solaris Trusted Extensions. Logical Domains是专门为Sun的UltraSPARC T1(Niagara)专门设计的一个虚拟技术,能够将32路的UltraSPARC T1逻辑分为32台Solaris. Solaris Trusted Extensions原来但是Sun专门为美国国防部,军方部门定制的系统,原是一个独立产品,也要收取美

银河英雄传说

题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, -,30000.之后,他把自己的战舰也依次编号为1, 2,