计蒜客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 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...
随机推荐
- EasyUI中easyui-combobox的onchange事件。
html: <select id="cbox" class="easyui-combobox" name="dept" style=& ...
- C语言Linix服务器网络爬虫项目(一)项目初衷和网络爬虫概述
一.项目初衷和爬虫概述 1.项目初衷 本人的大学毕设就是linux上用c写的一个爬虫,现在我想把它完善起来,让他像一个企业级别的项目.为了重复发明轮子来学习轮子的原理,我们不使用第三方框架(这里是说的 ...
- python 基础 set 集合类型补充
为啥今天又重提这个数据类型呢?平时用的少,等要用起来的时候才发现,自己对这块啥都不知道了,so,今天就把这块再梳理一下咯. 一.set集合,是一个无序且不重复的元素集合.这一点是非常重要的. 二.集合 ...
- python random 模块的用法
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- mySql一个字段的值模糊匹配多表多列的查询
1.dao层/** * 分页查询点卡集合信息 * @param tid 游戏类型编号 * @param gid 游戏编号 * @param searchInfo 包括(点卡名称,游戏名称,点卡面值,游 ...
- 初次面对c++
第一次实验 2-4源码: #include<iostream> using namespace std; int main() { int day; cin>>day; swi ...
- gradle入门(1-5)创建并运行Web应用
一.使用Gretty运行Web应用 Gretty支持Jetty和Tomcat,它不会被Gradle缺少SLF4J绑定所导致的问题所困扰. 1.配置文件build.gradle buildscript ...
- XML之XPath
1.在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档节点(或称为根节点). 1.1 XPath 术语 节点(Node) 在 XPath 中,有七种类型的节点:元 ...
- H5 input输入限制最大位数,和调用小键盘需求发生冲突的解决办法
首先,限制输入最大位数时,input有自带的属性maxlength. <input type="text" name="email" maxlength= ...
- [转][scrapy] CannotListenError: Couldn’t listen on [Errno 98] Address already in use.
[scrapy] CannotListenError: Couldn't listen on [Errno 98] Address already in use. python eason 1年前 ...