【问题描述】
    瑞奥和玛德利德是非常好的朋友。瑞奥平时的爱好是吹牛,玛德利德的爱好是戳穿瑞奥吹的牛。
    这天瑞奥和玛德利德来到了宇宙空间站,瑞奥向玛德利德炫耀这个空间站里所有的银河战舰都是自己的。整个空间站可以看成一个无限大的二维平面,而每个战舰都可以看做一个点,在空间站中一共分布着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[][];
Matrix()
{
memset(a,,sizeof(a));
a[][]=;a[][]=;a[][]=;
}
}Mat,c[],st;
double x[],y[];
char s[];
int n,m;
Matrix operator *(const Matrix &x,const Matrix &y)
{
Matrix res;
int i,j,k;
memset(res.a,,sizeof(res.a));
for (j=;j<=;j++)
{
for (k=;k<=;k++)
if (y.a[k][j])
{
for (i=;i<=;i++)
{
res.a[i][j]+=x.a[i][k]*y.a[k][j];
}
}
}
return res;
}
void pushdown(int rt)
{
c[rt*]=c[rt*]*c[rt];
c[rt*+]=c[rt*+]*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)/;
if (L<=mid) update(rt*,l,mid,L,R);
if (R>mid) update(rt*+,mid+,r,L,R);
}
void dfs(int rt,int l,int r)
{
if (l==r)
{
printf("%.2lf %.2lf\n",x[l]*c[rt].a[][]+y[l]*c[rt].a[][]+c[rt].a[][],y[l]*c[rt].a[][]+x[l]*c[rt].a[][]+c[rt].a[][]);
return;
}
pushdown(rt);
int mid=(l+r)/;
dfs(rt*,l,mid);
dfs(rt*+,mid+,r);
}
int main()
{int i,j,l,r;
double p,q,a;
cin>>n;
for (i=;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}
cin>>m;
for (i=;i<=m;i++)
{
scanf("%s",s);
scanf("%d%d",&l,&r);
if (s[]=='M')
{
scanf("%lf%lf",&p,&q);
memset(Mat.a,,sizeof(Mat.a));
Mat.a[][]=;Mat.a[][]=p;Mat.a[][]=;Mat.a[][]=q;
Mat.a[][]=;
update(,,n,l,r);
}
if (s[]=='X')
{
memset(Mat.a,,sizeof(Mat.a));
Mat.a[][]=-;Mat.a[][]=;Mat.a[][]=;
update(,,n,l,r);
}
if (s[]=='Y')
{
memset(Mat.a,,sizeof(Mat.a));
Mat.a[][]=;Mat.a[][]=-;Mat.a[][]=;
update(,,n,l,r);
}
if (s[]=='O')
{
memset(Mat.a,,sizeof(Mat.a));
Mat.a[][]=;Mat.a[][]=;Mat.a[][]=;
update(,,n,l,r);
}
if (s[]=='R')
{
memset(Mat.a,,sizeof(Mat.a));
scanf("%lf",&a);
Mat.a[][]=Mat.a[][]=cos(a*acos(-)/);
Mat.a[][]=sin(a*acos(-)/);
Mat.a[][]=-sin(a*acos(-)/);
Mat.a[][]=;
update(,,n,l,r);
}
}
dfs(,,n);
}

计蒜客NOIP模拟赛(2) D2T3 银河战舰的更多相关文章

  1. 计蒜客NOIP模拟赛D2T3 数三角形

    刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分. ...

  2. 计蒜客NOIP模拟赛6 D1T1Diamond-square

    Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2​n​​×2​n​​ 的网格,一共有 (2^n+1)^2(2​n ...

  3. 计蒜客NOIP模拟赛4 D2T1 鬼脚图

    鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...

  4. 计蒜客 NOIP模拟赛(3) D1T1火山喷发

    火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 nnn 个生物分别具有 A1,A2,⋯,An​​点生命值,一次火山喷发总计 M轮,每轮造成 1点伤害,等 ...

  5. 计蒜客NOIP模拟赛(2) D1T1邻家男孩

    凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...

  6. 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi

    那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11  ...

  7. 计蒜客NOIP模拟赛4 D2T2 跑步爱天天

    YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...

  8. 计蒜客NOIP模拟赛4 D1T3 小X的佛光

    小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...

  9. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

随机推荐

  1. I Know Alpha冲刺随笔集

    Alpha冲刺 Day1 Alpha冲刺 Day2 Alpha冲刺 Day3 Alpha冲刺 Day4 Alpha冲刺 Day5 Alpha冲刺 Day6 Alpha冲刺 Day7 Alpha冲刺 D ...

  2. 第1次作业:小菜鸟的平凡IT梦

    #1.结缘计算机的始末 ##1.1与计算机相识的几年 作为一个95后,出生在一个互联网开始兴盛的时代.我记得小学的时候,开始知道电脑这个东西,学校有了机房,开始有了所谓的电脑课.那时候计算机对于我来说 ...

  3. C语言——第二次作业

    **学习内容总结** 本周是国庆假期,学习了mooc相关课程.阅读了<提问的智慧>一文. 文章总结 1.在提问之前,要利用身边的资源(例如相关资料.FAQ.浏览器搜索)试着自己寻找答案,或 ...

  4. android 广播安装指定下载的apk

    // 广播出去,由广播接收器来处理下载完成的文件   Intent sendIntent = new Intent("com.test.downloadComplete");    ...

  5. Jmeter读取文件中的值《一》

    此篇主要是对应上一章节的呼应,上一篇中讲到将返回值写入文件,这个值如果在下一个接口中用到, 那么我们需要去从文件中读取数据,这是我们该如何操作? 一.测试计划中添加CSV Data Set Confi ...

  6. Node入门教程(7)第五章:node 模块化(下) npm与yarn详解

    Node的包管理器 JavaScript缺少包结构的定义,而CommonJS定义了一系列的规范.而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题. ...

  7. Solaris 11 system package 安装与更新(如:assembler)

    最近在VirtualBox虚拟机中导入了Solaris 11.3.在里面安装Oracle数据库时,先行条件检查没通过,提示缺少程序包assembler. 在网上看了许多,这方面的信息还比较少.最后在O ...

  8. emqtt 试用(九)ssl认证 - 客户端 mqttfx 验证

    一.代码生成证书 1.安装openssl,配置path变量 安装文件:Win64OpenSSL-1_1_0f.exe 安装openssl:C:\OpenSSL-Win64 配置path变量:C:\Op ...

  9. Spring知识点回顾(02)AOP

    一.注解拦截 二.方法规则拦截

  10. Linux实战案例(7)安装jdk

    一.文件准备 1.1 文件名称 jdk-8u121-linux-x64.tar.gz 1.2 下载地址 http://www.oracle.com/technetwork/java/javase/do ...