Codeforces 400C 矩阵乘法 数学规律
2014-03-24 20:37
316 查看
今天下午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直接输出结果即可啦
这题给定一个由二进制表示的矩阵,当询问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[1010][1010]; //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=1;i<=n;i++) { for (int j=1;j<=n;j++) { scanf("%d",&mat[i][j]); } //pr[i]=pc[i]=0; } int ans=0; for (int i=1;i<=n;i++) ans=ans^mat[i][i]; //init(); //int ans=counts(); scanf("%d",&q); for (int i=0;i<q;i++) { scanf("%d",&a); if (a<3) { scanf("%d",&b); ans^=1; } else { //putdown(); //counts(); printf("%d",ans); } } printf("\n"); } }
相关文章推荐
- 华中农业大学第五届程序设计大赛 D GCD [fibonacci+矩阵乘法]【数学】
- 【矩阵乘法+快速幂】数学序列
- 游戏开发中的数学和物理算法(16):矩阵的乘法
- 【矩阵乘法】bzoj2326 [HNOI2011]数学作业
- 【bzoj2326】【HNOI2011】【数学作业】【矩阵乘法】
- 【BZOJ2326】[HNOI2011]数学作业 矩阵乘法
- [WIKIOI 1250]Fibonacci数列(数论+数学+矩阵乘法+二分快速幂)
- 数学题-矩阵翻硬币-找规律
- BZOJ-2326-数学作业-HNOI2011-矩阵乘法
- [BZOJ]2326: [HNOI2011]数学作业 矩阵乘法
- 【数学相关、规律】Codeforces 707C Pythagorean Triples
- 游戏开发中的数学和物理算法(16):矩阵的乘法
- URAL 1814 Continued Fraction 数学 矩阵乘法
- BZOJ 2326 HNOI 2011 数学作业 矩阵乘法求数列第n项
- CodeForces - 707C Pythagorean Triples(数学+规律)
- hdu 6198 dfs枚举找规律+矩阵乘法
- codeforces 400C - Inna and Huge Candy Matrix(耐心找规律,细节还是要注意的)
- 【数学相关、规律】Codeforces 696B Puzzles
- [矩阵乘法转图论 强连通] Codeforces 403C #236 (Div. 1) C. Strictly Positive Matrix
- BZOJ 2326 HNOI 2011 数学作业 矩阵乘法