计蒜客NOIP模拟赛(2) D2T3 银河战舰
【问题描述】
瑞奥和玛德利德是非常好的朋友。瑞奥平时的爱好是吹牛,玛德利德的爱好是戳穿瑞奥吹的牛。
这天瑞奥和玛德利德来到了宇宙空间站,瑞奥向玛德利德炫耀这个空间站里所有的银河战舰都是自己的。整个空间站可以看成一个无限大的二维平面,而每个战舰都可以看做一个点,在空间站中一共分布着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 银河战舰的更多相关文章
- 计蒜客NOIP模拟赛D2T3 数三角形
刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分. ...
- 计蒜客NOIP模拟赛6 D1T1Diamond-square
Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2n×2n 的网格,一共有 (2^n+1)^2(2n ...
- 计蒜客NOIP模拟赛4 D2T1 鬼脚图
鬼脚图,又称画鬼脚,在日本称作阿弥陀签,是一种经典游戏,也是一种简易的决策方法,常常用来抽签或决定分配组合. 下图就是一张鬼脚图,其包含若干条竖线和若干条横线.请注意,横线只能水平连接相邻的两条竖线, ...
- 计蒜客 NOIP模拟赛(3) D1T1火山喷发
火山喷发对所有附近的生物具有毁灭性的影响.在本题中,我们希望用数值来模拟这一过程. 在环境里有 nnn 个生物分别具有 A1,A2,⋯,An点生命值,一次火山喷发总计 M轮,每轮造成 1点伤害,等 ...
- 计蒜客NOIP模拟赛(2) D1T1邻家男孩
凡是一个具有领导力的孩子.现实生活中他特别喜欢玩一个叫做 UNO 的纸牌游戏,他也总是带着其他小朋友一起玩,然后战胜他们.慢慢地,他厌倦了胜利,于是准备发明一种新的双人纸牌游戏. 初始时,每个人手中都 ...
- 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi
那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11 ...
- 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...
- 计蒜客NOIP模拟赛4 D1T3 小X的佛光
小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水. 小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一个发展中国家,为了节约城市建设的经费,X 国首相在建造 X ...
- 计蒜客NOIP模拟赛4 D1T2小X的密室
小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...
随机推荐
- JavaScript(第二十一天)【DOM元素尺寸和位置】
学习要点: 1.获取元素CSS大小 2.获取元素实际大小 3.获取元素周边大小 本章,我们主要讨论一下页面中的某一个元素它的各种大小和各种位置的计算方式,以便更好的理解. 一.获取元素CSS大小 ...
- 第2次作业:Wechat创作史
Wechat创作史 比尔盖茨曾经说过一句话:21世纪要么电子商务,要么无商可务. 2.1 介绍产品相关信息 -the information about Wechat 你选择的产品是? 选择微信作 ...
- 每日冲刺报告--Day2
敏捷冲刺每日报告--Day2 情况简介 今天我们三个人在一起开了会,分析了我们面临的情况以及下一阶段的计划.一个重大的改进是,我们准备把之前用txt文件格式存储订阅列表改成了文件json格式. 任务进 ...
- 使用Python定制词云
一.实验介绍 1.1 实验内容 在互联网时代,人们获取信息的途径多种多样,大量的信息涌入到人们的视线中.如何从浩如烟海的信息中提炼出关键信息,滤除垃圾信息,一直是现代人关注的问题.在这个信息爆炸的时代 ...
- 201621123031 《Java程序设计》第2周学习总结
Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...
- Flask 学习 四 数据库
class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primary_key=True) name = db.Co ...
- 解析与动作联动得SDN数据平面
一种解析与执行联动的SDN可编程数据平面 现有问题和目标 在传统协议处理方式中,各层的协议类型和组合方式固定,使得添加或修改协议很困难(因为需要修改网络设备的解析模式) 基于解析和执行联动结构的可编程 ...
- (原创)不带模板的OLE输出EXCEL
目前我已知的EXCEL输出方式有3种: 1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出). 2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一 ...
- 命令行窗口中用telnet测试HTTP协议
1. 命令行窗口中用telnet测试HTTP协议 HTTP消息是由普通ASCII文本组成.消息包括消息头和数据体部分.消息头以行为单位,每行以CRLF(回车和换行)结束,消息头结束后,额外增加一个CR ...
- nyoj Color the fence
Color the fence 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Tom has fallen in love with Mary. Now Tom w ...