ABC 189 E - Rotate and Flip 矩阵转移

传送门

题意:给定n个点,m个操作,n和m都是1e5级别的。让后每个操作是将这个点绕原点顺时针、逆时针转90°,将这个点按照 x = p 或着 y = p 做对称。再有q个询问,q也是1e5级别的。让后每个询问是问B这个点在第A次操作之后在哪里。

显然我们不能直接暴力,因为都达到了1e5级别。
一开始像找一下规律,看看是否这几个操作是相互独立的,一开始发现了点,但是随着越来越多的例子,很快否定了我找规律的想法。
现在问题就是我们能否将点的变换转变成类似乘法除法之类可以累计的变量呢?显然就会发现矩阵是满足这个性质的,我们只需要对每个操作递推维护一个右乘矩阵,当需要进行前A次操作的时候只需要乘一下A这个操作之前的矩阵乘积即可。
下面依次给出这几个操作的矩阵。
当然为了方便我们可以把初始矩阵写成
(xy1)\begin{pmatrix} x & y & 1\\ \end{pmatrix} (xy1)
(0−10100001)\begin{pmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix} 010100001
(010−100001)\begin{pmatrix} 0 & 1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix} 010100001
(−1000102p01)\begin{pmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 2p & 0 & 1 \end{pmatrix} 102p010001
(1000−1002p1)\begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 2p &1 \end{pmatrix} 100012p001
为什么多加了一维呢?想必看到上面矩阵的时候大家也知道了,因为对称的时候会多一个常数,所以加一维比较方便处理常数。
下面代码仅供参考,写的比较乱

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
struct Point
{int x,y;
}q[N];
struct Query
{LL mp[3][3];
}node[N],t;
vector<Query>v;void mult(int id,Query v,int op)
{int x;if(op==3||op==4) scanf("%d",&x);if(op==3) v.mp[2][0]=2*x;else if(op==4) v.mp[2][1]=2*x;for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)node[id+1].mp[i][j]+=node[id].mp[i][k]*v.mp[k][j];
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);t.mp[0][0]=0; t.mp[0][1]=-1; t.mp[0][2]=0;t.mp[1][0]=1; t.mp[1][1]=0; t.mp[1][2]=0;t.mp[2][0]=0; t.mp[2][1]=0; t.mp[2][2]=1;v.push_back(t);t.mp[0][0]=0; t.mp[0][1]=1; t.mp[0][2]=0;t.mp[1][0]=-1; t.mp[1][1]=0; t.mp[1][2]=0;t.mp[2][0]=0; t.mp[2][1]=0; t.mp[2][2]=1;v.push_back(t);t.mp[0][0]=-1; t.mp[0][1]=0; t.mp[0][2]=0;t.mp[1][0]=0; t.mp[1][1]=1; t.mp[1][2]=0;t.mp[2][0]=0; t.mp[2][1]=0; t.mp[2][2]=1;v.push_back(t);t.mp[0][0]=1; t.mp[0][1]=0; t.mp[0][2]=0;t.mp[1][0]=0; t.mp[1][1]=-1; t.mp[1][2]=0;t.mp[2][0]=0; t.mp[2][1]=0; t.mp[2][2]=1;v.push_back(t);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d%d",&q[i].x,&q[i].y);scanf("%d",&m);node[0].mp[0][0]=node[0].mp[1][1]=node[0].mp[2][2]=1;for(int i=1;i<=m;i++){int op; scanf("%d",&op);mult(i-1,v[op-1],op);}int _; scanf("%d",&_);while(_--){int a,b; scanf("%d%d",&a,&b);Query t,ans;memset(t.mp,0,sizeof(t.mp));memset(ans.mp,0,sizeof(ans.mp));t.mp[0][0]=q[b].x,t.mp[0][1]=q[b].y,t.mp[0][2]=1;for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)ans.mp[i][j]+=t.mp[i][k]*node[a].mp[k][j];printf("%lld %lld\n",ans.mp[0][0],ans.mp[0][1]);}return 0;
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我,宇宙最强编辑器,支持远程开发

Visual Studio Code 五月份更新之 1.35 版本已发布。此次更新的亮点包括更新 Visual Studio Code 图标 - 新版本更新了 logo。改进“转到定义&#xff08;Go to Definition&#xff09;”行为 - 通过多个定义的显示&#xff0c;更快速进行导航&#xff08;Navigation&#xff0…

ARC068C - Snuke Line

ARC068C - Snuke Line Description 其实就是给出nnn个区间[li,ri][l_i,r_i][li​,ri​]对于每一个i∈[1,M]i\in[1,M]i∈[1,M]&#xff0c;求&#xff1a; ∑j1n[⌊rji⌋−⌊lj−1i⌋≥1]\sum_{j1}^n[\lfloor \frac{r_j}{i}\rfloor-\lfloor \frac{l_j-1}{i}\rfloor\geq 1]j1∑…

.NET Core Run On Docker By Kubernetes 系列文章汇总

前言介绍.NET Core是微软新一代主力编程平台&#xff0c;开源、免费、跨平台、轻量级、高性能&#xff0c;支持Linux、Docker、k8s等环境&#xff0c;适合开发微服务、云原生、大型互联网应用、全开源解决方案。Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们…

HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

link 题意&#xff1a; 首先看到排名自然想到拓扑序&#xff0c;但是存在等于的情况&#xff0c;这就启发我们把等于的情况缩成一个点&#xff0c;让后在缩点后的图中进行拓扑即可。 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点&#xff0c;所以只需要检查遍历了几个…

[ARC072C]Alice in linear land(dp,贪心)

[ARC072C]Alice in linear land Description 给定a1...ana_1...a_na1​...an​和DDD&#xff0c;mmm轮询问&#xff0c;每轮询问给你一个qqq&#xff0c;可以让你任意修改aqa_qaq​的值&#xff0c;然后从小到大对于每一个iii让Dmin(D,D−ai)Dmin(D,D-a_i)Dmin(D,D−ai​)&am…

.NET Core 中使用 Humanizer 显示友好时间格式

今天在将一个 .net framework 项目迁移至 .net core 的过程中&#xff0c;在迁移到显示友好时间格式&#xff08;比如“1分钟前”&#xff0c;“1小时前”&#xff09;的代码时&#xff0c;找了找看有没有对应的开源库&#xff0c;结果找到了 Humanizer &#xff0c;顺手体验了…

Codeforces Round #698 (Div. 2)

B题 题意&#xff1a;定义一个牛逼的数是这个数十进制中至少包含一个数d。 现在给定d和若干询问&#xff0c;每个询问一个x&#xff0c;问x能否分解成若干d构成的牛逼的数之和。 看起来挺难搞的&#xff0c;不能快速的判断是否是牛逼的数而且也不能很好的挑选合适的数组成x。那…

[ARC073C] Ball Coloring(贪心)

[ARC073C] Ball Coloring Solution 我们发现编号的最大值maxmaxmax必然会在Rmax,BmaxR_{max},B_{max}Rmax​,Bmax​中至少一个出现&#xff0c;最小值minminmin必然会在Rmin,BminR_{min},B_{min}Rmin​,Bmin​中至少一个出现。 因此会有四种情况&#xff1a; Rmaxmax,Rminmi…

P2831 [NOIP2016 提高组] 愤怒的小鸟 状压dp

某谷链接 题意&#xff1a;选最少的抛物线来覆盖所有点。 注意到a<0&#xff0c;所以我们可以枚举两个点来构成一条抛物线&#xff0c;让后记这两个点构成的抛物线为 cov[i][j]cov[i][j]cov[i][j]&#xff0c;让后他存的是这个抛物线能覆盖到的点的集合&#xff0c;把它存成…

Visual Studio 2019 16.1 使用 .NET Core 3.0

一.前言早在很久之前微软便公布 .NET Core 3.0 将支持开发Winform应用程序等等新特性&#xff0c;现如今 .NET Core 3.0 预览版已经出来第五个预览版了&#xff0c;从 .NET Core 2.2 到 3.0 将是一个大的跨越&#xff0c;从发布的预览版本个数来看&#xff0c;将会增加很多的功…

P4288 [SHOI2014]信号增幅仪 最小圆覆盖

传送门 题意&#xff1a;给出一些点&#xff0c;让后让你用一个ba1p\frac{b}{a}\frac{1}{p}ab​p1​的且绕x正方向逆时针转动了a的椭圆覆盖&#xff0c;求最小的b。 由于题目中椭圆是绕x正方向逆时针旋转了a&#xff0c;为了方便写出方程&#xff0c;我们可以先把它顺时针转回…

[ARC074C] RGB Sequence(dp)

[ARC074C] RGB Sequence Solution 显然是一道dpdpdp&#xff0c;我们发现直接维护当前状态有多少种颜色不好维护&#xff0c;因为颜色只有333种&#xff0c;所以可以直接记录每一种颜色最晚在哪里出现&#xff0c;令fi,j,k,lf_{i,j,k,l}fi,j,k,l​表示前iii个里RRR最晚在jjj&…

Insider Dev Tour 2019 全球巡演 苏州站

Insider Dev Tour微软&#xff0c;全球&#xff0c;巡演&#xff0c;内幕大会介绍Insider Dev Tour 是 Microsoft Build 技术大会的全球巡演活动&#xff0c;是微软面向广大开发者、技术爱好者&#xff0c;介绍其未来技术发展方向的盛会。在 Microsoft Build之后&#xff0c;会…

CERC17 Problem L - Lunar Landscape(差分,坐标系)

CERC17 Problem L - Lunar Landscape Solution 如果只有AAA&#xff0c;我们可以简单地使用差分解决。 加入了BBB之后&#xff0c;可以把单位正方形用对角线拆成四个等腰Rt&#xff0c;统计等腰Rt的个数。我们先进行坐标转换&#xff0c;把(x,y)−>(x−y,xy)(x,y)->(x-…

.NET Core 性能分析: xUnit.Performance 简介

xunit-performance 是xUnit的一个扩展&#xff0c; 使用它可以对.NET Core项目进行性能测试。官网&#xff1a;https://github.com/Microsoft/xunit-performancexUnit大家可能都用过&#xff0c;它是用来做单元测试的&#xff0c;它可以很快给开发人员功能是否OK的反馈。和xUni…

Codeforces Round #703 (Div. 2) Guessing the Greatest C1 C2 二分

link 题意&#xff1a;交互题&#xff0c;每次可以询问一个区间的次大值&#xff0c;保证所有值都不相同&#xff0c;求最大值位置。easy是询问最多40次&#xff0c;hard最多20次。 交互题大部分都是二分&#xff0c;可以向二分考虑。 easy比较好想&#xff0c;假设当前区间为…

TeamCity+Rancher+Docker实现.Net Core项目DevOps

1.准备项1.1.服务器一台&#xff0c;1H4G&#xff08;更小内存应该也可以&#xff0c;自行测试&#xff09;&#xff0c;系统&#xff1a;Ubuntu 16.04 64位1.2.数据库一个&#xff0c;MYSQL,MSSQL都可以&#xff08;还有其他的&#xff0c;自行配置&#xff09;,教程是MSSQL1.…

ARC078F - Mole and Abandoned Mine(状压DP)

ARC078F - Mole and Abandoned Mine Solution 状压dpdpdp。 首先去掉边最小选取边最大&#xff0c;答案为所有边权和减掉选取边权和&#xff0c;于是我们想要最大化选取的边权和。 假设我们知道最后剩下的唯一一条1...n1...n1...n的路径v1,v2,v3...vk(v11,vkn){v_1,v_2,v_3…

Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维

传送门 题意&#xff1a; 给定一个数组和k&#xff0c;求一段连续区间中位数最大值&#xff0c;连续区间长度>k。 如果k的话可以直接秒了&#xff0c;这里是>k&#xff0c;我们可以通过二分让后利用>k这个条件来检查答案。 二分中位数&#xff0c;假设当前二分的为m…

.NET工程师的书单

短暂的假期里抽空整理了一份书单&#xff0c;以个人的见解这些应该是值得.NET工程师至少去看一遍的书籍。但所罗列的仅包括国内目前已出版的国外书籍的英文版&#xff0c;并不包含中文翻译及相关领域的中文书籍。这里没有任何歧视之意&#xff0c;只是更推荐工程师具备熟练阅读…