首页 > 其他分享 >洛谷 AT_past202005_i 行列操作 の 题解

洛谷 AT_past202005_i 行列操作 の 题解

时间:2023-09-13 11:45:24浏览次数:42  
标签:le 洛谷 option cdot 题解 past202005 cin long 初始值

这道题最难的点在于用什么方法存储矩阵 $a$ 和一个特殊的操作方式。

要存矩阵 $a$,最先想到的是二维数组,但是二维数组开不到 $1 \le n \le 10^5$,所以可以用一个长度为 $2 \cdot n$ 的一维数组 $m$ 来存。当 $i \le n$ 时,让一维数组 $m_{i}$ 负责存第 $i$ 行的内容;而当 $n + 1 \le i \le 2 \cdot n$ 时,$m_{i}$ 负责存第 $i$ 列的内容。

由题目给出的内容公式和我们用的方法可知最终该怎么对 $m_{i}$ 赋初始值。

  • $i \le n$ 时,$m_{i} = n \cdot (i - 1)$

  • $n + 1 \le i \le 2 \cdot n$ 时, $m_{i} = i - 1 - n$

于是有了以下代码。

for(long long i = 1; i <= n; i++) m[i] = n * (i - 1);
for(long long i = n + 1; i <= 2 * n; i++) m[i] = i - 1 - n;

之后我们可以想一下大概思路。首先定义两个变量 $a$ 和 $b$,$a$ 初始值设定为 $0$,负责行,$b$ 初始值设定为 $n$,负责列,他们俩要担负表示行列和交换行列的重任,大概意思是第 $i$ 行被表示为 m[a + x],第 $i$ 列则被表示为 m[b + y],要交换的时候只要交换 $a$ 和 $b$ 即可。

大概思路已经说完了,我就直接在下面放代码了。

#include <iostream>
using namespace std;
long long n, q, m[1000001], a, b;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
    cin >> n >> q;
    for(long long i = 1; i <= n; i++) m[i] = n * (i - 1);
    for(long long i = n + 1; i <= 2 * n; i++) m[i] = i - 1 - n;
    a = 0, b = n;
    for(long long i = 1; i <= q; i++){
        long long option;
        cin >> option;
        if(option == 1){
            long long x, y;
            cin >> x >> y;
            swap(m[a + x], m[a + y]);
        }
        else if(option == 2){
            long long x, y;
            cin >> x >> y;
            swap(m[b + x], m[b + y]);
        }
        else if(option == 3) swap(a, b);
        else{
            long long x, y;
            cin >> x >> y;
            long long ans = m[a + x] + m[b + y];
            cout << ans << endl;
        }
    }
    return 0;
}

记录

标签:le,洛谷,option,cdot,题解,past202005,cin,long,初始值
From: https://www.cnblogs.com/NFGase/p/17699167.html

相关文章

  • 洛谷 AT_maximum_cup_2018_a フィギュアスケート界の貴公子埼大選手 の 题解
    这道题是一道水题,所以你的代码很可能与我相似或相同,如果你的代码出现了问题,你很可能在我的题解里找出答案。这道题大概思路是一旦$10$秒后运动员会接触到毛绒玩具,那么就加上在这个点上毛绒玩具的数量。但是!这道题有一道巨坑的点!由于这道题比较远古,所以说你即使是正解,你也要在......
  • 【题解】Educational Codeforces Round 141(CF1783)
    评价:educationalA.MakeitBeautiful题目描述:如果一个数组中存在一个数恰好等于该数前面所有数之和,那么这个数组就是丑的。如果一个数组不是丑的,就是美的。比如说:数组$[6,3,9,6]$是丑的,因为\(9=6+3\);数组$[5,5,7]$是丑的,因为第二个\(5=5\)。数组$......
  • 【题解】DP选练(23.9.11 - 23.9.12)
    一些写过题解的题我就直接挂连接了。[NOIP2018提高组]货币系统题目描述:在网友的国度中共有\(n\)种不同面额的货币,第\(i\)种货币的面额为\(a[i]\),你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为\(n\)、面额数组为\(a[1..n]\)的货币系统记作\((n,a)\)。......
  • [题解]AT_arc116_b [ARC116B] Products of Min-Max
    思路我们容易可以得到一个朴素的做法,首先对\(a\)数组排序,然后枚举最大值和最小值\(a_i,a_j\),那么对于中间的元素都有选与不选两种情况,得到答案:\[\sum_{i=1}^{n}(a_i\timesa_i+(\sum_{j=i+1}^{n}a_i\timesa_j\times2^{j-i-1}))\]然后对这个式子做一个化简:......
  • 【Flink系列十八】HDFS_DELEGATION_TOKEN过期的问题解决汇总
    问题类别Spark框架自身的问题Hadoop全家桶的问题开发者通过Hive,HDFS,HBASE访问HDFS的问题排查已知Hadoop-common-2.6.0的UGI存在bug,代码为HADOOP-10786,该问题在CDH发行版中已经修复,但Apache版本存在问题。已知HDFS也存在一个HDFS_DELEGATION_TOKEN过期的bug,代码为HDFS-9......
  • xilinx赛灵思下载器jtag-hs3兼容alinx仿真fpga烧录digilent高速常见问题解答
    1.概述  XJTAG-HS3是XILINX的USB转JTAG的高速仿真器,可以下载、烧录和仿真Xilinx FPGA和CPLD芯片,以及配置PROM、FLASH. XJTAG-HS3比PlatformCableUSBII下载器快10倍速度。 可以在30Mbit/秒下驱动JTAG/SPI总线,并且能实现对XilinxZYNQ平台处理器核的重置。可以支持ZYN......
  • P3616 富金森林公园 题解
    P3616富金森林公园题解题意给你\(n\)个点,有\(m\)次操作,每次操作可以改变一个数的值,也可以查询有多少连续的块,满足这个块内的所有数的值都大于查询的值。分析还是比较容易想到用数据结构或分块的,毕竟有同时存在修改和查询操作。但是维护什么?怎么维护?既然我们无法直接维......
  • 关于sql server 2008 r2 安装闪退问题解决办法
    打开sqlserverr2安装包文件目录找到SQL2008R2_64\2052_chs_lp\x64\setup\sqlsupport_msi目录下sqlsupport.msi,运行安装 a、在安装盘中搜索sqlsupport,找到对应的sqlsupport.msi文件并安装,一般路径如下:Windows64位系统需要安装:..\sql2008r2.iso\2052_chs_lp\x64\setup\sqls......
  • 【ABC105D】题解
    题解题意简述给定\(n\)个数,求这\(n\)个数中有多少个二元组\((x,y)\)满足其中每一个数都是\(m\)的倍数。思路前缀和,\((x,y)\)内每一个数\(\bmod\m=0\),可以用\((sum_y-sum_{x-1})\bmod\m=0\)表示。但是这题数据太大,所以要使用map。如果\(x=1\),......
  • ABC319 A-E 题解
    A用map<string,int>将名字对应的值存下来即可。赛时代码B按照题意暴力模拟,注意细节。赛时代码C答辩题,卡了我半个小时。枚举\(1\sim9\)的全排列,然后按照顺序计算即可,但代码实现比较答辩。赛时代码D显然具有可二分性,直接二分并判定可行性即可,注意不合法条件。赛......