Codeforces 400C 矩阵乘法 数学规律
今天下午Virtual了一套最近的CF题,第三题给TLE了,就跑过去上课了。
这题给定一个由二进制表示的矩阵,当询问3的时候,求矩阵的值,矩阵的值是所有第i行乘以第i列的值的总和,然后还有1 b是翻转b行的数字 2 b是翻转b列的数字
一开始没怎么考虑复杂度,就直接想暴力过,觉得只要把翻转先暂存,最后有询问3的时候再pushdown再计算一下结果。。。简直不经大脑思考,有10^6询问,我这样做,如果询问全部是3,那光是计算矩阵10^6次就能达到12次方的复杂度。。。真是一点都不考虑。。。
后来在课上想了点方法,觉得把每一行和列的翻转都预处理一下,以及先把原始结果预处理出来,然后遇到翻转就跟之前的状态比一下看看要不要翻转结果的值。、。。遇到3就可以直接输出了,这样做还是WA了。。。
结果后来搜题解,发现,这个题目真的是个规律水题啊啊啊。。。很明显,n*n的矩阵如果是按i行与i列相乘的和作为结果的话,那么非对角线的元素都会与对称位相乘,并且还会加两次,同一个二进制值相加两次,那不就相当于没加,也就是说只有对角线的元素对结果有影响。。。。
想到这里真是要哭了,那不就很简单的一题目,先按位跟对角线的值异或得到初始结果,然后底下但凡有翻转操作,就把结果翻转(因为每次行或者列的翻转必定造成对角线某个元素翻转,也就直接造成结果翻转)。。然后遇到3直接输出结果即可啦
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int mat[][];
//int row[1010],col[1010]
int n,q;
//int change[1010][2][2];
//int pr[1010],pc[1010];
//void putdown()
//{
// for (int i=1;i<=n;i++)
// {
// if (row[i])
// {
// for (int j=1;j<=n;j++)
// {
// mat[i][j]^=1;
// }
// row[i]=0;
// }
// if (col[i])
// {
// for (int j=1;j<=n;j++)
// {
// mat[j][i]^=1;
// }
// col[i]=0;
// }
// }
//}
//int counts()
//{
// int ans=0;
// for (int i=1;i<=n;i++)
// {
// int t=0;
// for (int j=1;j<=n;j++)
// {
// int tmp=mat[i][j]*mat[j][i];
// ans+=tmp;
// t+=tmp;
// //change[i][0][0]=tmp;
// }
// change[i][0][0]=t%2;
// }
// ans%=2;
// return ans;
//
//}
//void init()
//{
// for (int i=1;i<=n;i++)
// {
// int t1,t2,t3;
// t1=t2=t3=0;
// for (int j=1;j<=n;j++)
// {
//
// if (j==1)
// {
// t1+=(1-mat[i][j])*(1-mat[j][i]);
// t2+=(1-mat[i][j])*(1-mat[j][i]);
// t3+=(1-mat[i][j])*(1-mat[j][i]);
// }
// else
// {
// t1+=(1-mat[i][j])*mat[j][i];
// t2+=mat[i][j]*(1-mat[j][i]);
// t3+=(1-mat[i][j])*(1-mat[j][i]);
// }
// }
// change[i][1][0]=t1%2;
// //change[i][1][0]^=change[i][0][0];
//
// change[i][0][1]=t2%2;
// //change[i][0][1]^=change[i][0][0];
//
// change[i][1][1]=t3%2;
// //change[i][1][1]^=change[i][0][0];
// //cout<<change[i][1][0]<<" "
// }
//}
int main()
{
int a,b;
// freopen("CF_238.txt","w",stdout);
while (scanf("%d",&n)!=EOF)
{
for (int i=;i<=n;i++)
{
for (int j=;j<=n;j++)
{
scanf("%d",&mat[i][j]);
}
//pr[i]=pc[i]=0;
}
int ans=;
for (int i=;i<=n;i++)
ans=ans^mat[i][i];
//init();
//int ans=counts(); scanf("%d",&q);
for (int i=;i<q;i++)
{
scanf("%d",&a);
if (a<)
{
scanf("%d",&b);
ans^=;
}
else
{
//putdown();
//counts();
printf("%d",ans);
}
}
printf("\n");
}
}
Codeforces 400C 矩阵乘法 数学规律的更多相关文章
- Codeforces C. Almost Equal (数学规律)
题目链接:http://codeforces.com/contest/1206/problem/C 题解 : 观察可以发现当n为偶数时,1 - 2n是不满足题意的,可以举例n = 2,n = 4试一试 ...
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
数学作业 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 输入文件只有一行为用空 ...
- Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))
C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- 矩阵乘法在numpy/matlab/数学上的不同
数学意义上的矩阵乘法 注意事项: 1.当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘. 2.矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 3.乘积C的第m行第n列的 ...
- 矩阵乘法快速幂 cojs 1717. 数学序列
矩阵乘法模板: #define N 801 #include<iostream> using namespace std; #include<cstdio> int a[N][ ...
- Codeforces 506E - Mr. Kitayuta's Gift(神仙矩阵乘法)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%%%%%%%%%%%% u1s1 感觉这道题风格很省选( 下记 \(m=|s|\),首先探讨 \(n+m\) 为偶数的情形. ...
- Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...
- Codeforces 750E - New Year and Old Subsequence(线段树维护矩阵乘法,板子题)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 我做这道 *2600 的动力是 wjz 出了道这个套路的题,而我连起码的思路都没有,wtcl/kk 首先考虑怎样对某个固定的串计 ...
随机推荐
- JAVA String类常用方法
一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建 ...
- JAVA笔记01 变量的取名
第2章 有意义的命名2.1 介绍2.2 名副其实 变量名太随意,haha.list1.ok 这些都没啥意义2.3 避免误导 包含List等关键字.字母o与数字0等2.4 做有意义的区分 反面教材,变量 ...
- 【学CG系列】web之审查元素
一.审查元素的作用 审查元素(你的F12)可以做到定位网页元素.实时监控网页元素属性变化的功能,可以及时调试.修改.定位.追踪检查.查看嵌套 ,修改样式和查看js动态输出信息,是开发人员得心应手的好工 ...
- Card Stacking 队列模拟
题目链接:https://ac.nowcoder.com/acm/contest/993/ABessie is playing a card game with her N-1 (2 <= N ...
- GNS3 模拟icmp端口不可达
R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 no ip routing end R2 f0/0: conf t ...
- (转)linux shell 的here document 用法 (cat << EOF)
什么是Here Documen: Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下 cmd << delimiter Here Docu ...
- 158-PHP strstr函数输出第一次出现字符串的位置到字符串结尾的所有字符串
<?php $str='PHP is a very good programming language!'; //定义一个字符串 echo '第一次出现字母l的位置到字符串结尾的所有字符串'.s ...
- 代码化UI设计
最近在阅读Qt 5.9 C++开发指南,为了加深对书本上内容的理解,参照书上的讲解尝试写了一些demo,用于以后工作中查阅,如果涉及侵权请告知,实例程序samp2_3 mydialog.h #ifnd ...
- CSS - 自学笔记
2018-12-14 ----- 1 所有元素的锚点默认就是它的物理中心 2 改变锚点位置的方法: transform-origin: x-axis y-axis z-axis; 3 ps里在层级里选 ...
- Mobile-H5网页快速滚动和回弹
现在很多for Mobile的HTML5网页内都有快速滚动和回弹的效果,看上去和原生app的效率都有得一拼. 要实现这个效果很简单,只需要加一行css代码即可: -webkit-overflow-sc ...