标签:logs 时间 desc img alt 测试 技术 整数 read
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 28325 | Accepted: 10341 |
Description
Input
Output
Sample Input
1 2 10 C 2 1 2 2 Q 2 2 C 2 1 2 1 Q 1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 Q 1 1 C 1 1 2 1 Q 2 1
Sample Output
1 0 0 1
Source
输入
输出
样例输入
1 2 10 C 2 1 2 2 Q 2 2 C 2 1 2 1 Q 1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 Q 1 1 C 1 1 2 1 Q 2 1
样例输出
1 0 0 1
题解:据说本题是用数学方法来做,但是oycy大学霸+lsh大学霸好像在我写这篇题解之前已经研究了2个小时了……
这里共享我的解题方法:
再说那天的数学听得我对数学没有信心了,所以压根就没想到数学;
不是说数学不可以,但是太过困难了(深切感受),
一想到数学便睡意袭来,
在睡了一会儿后,小人不才,大概花了40分钟便想出一个基于二维树状数组的思路:
现在我们设需要not变换的子矩阵左上坐标为(x1,y1)右下坐标(x2,y2)
不妨拓展1格,方便我们解题,先看到一幅图(拓展后)
注意到左上方有一个小黄人(这没什么用,请自行过滤)
黑方框为(0,0)
黑方框代表我们需要not的区域 红方框代表拓展出来的区域
TIPS:红方框边界上的点没画(lazy++),自己推吧,懒得画了,符合的。
在我的解题方案中,我们只要将点(橙框的4点)++
a[x1,y1]++
a[x2+1,y1]++
a[x1+1,y1]++
a[x2+1,y2+1]++
可以证明在黑方框外的任一点的二维前缀和是增量r mod 2 恒等于 0
而黑方框内的任一点的二维前缀和的增量r mod 2 恒等于 1
二维前缀和的最快维护方案是二维树状数组;具体维护不在多讲(本质是为树状数组+循环)
这样我们只要使4个点的权值++,维护前缀和,求Q(x,y)只要C(x,y)mod 2=1 则最终的点(x,y)就是1,反之就是0
做完了~~
用not 来维护树状数组你就中陷阱了;
或者用dp来做,也是行不通的;
希望lsh+oycy大学霸orz能够早日用数学AC本题!
代码:
uses math; var n,m,i,j,t,x1,x2,y1,y2,q,x,y,tt,ii:longint; c:array[0..1000,0..1000]of longint; ch:char; function lowbit(x:longint):longint; begin exit(x and (-x)); end; procedure update(xx,yy,opx:longint);//二维树状数组把数组中a[xx]+yy并且跟新树状数组c[] var ty,x,y:longint; begin x:=xx; y:=yy; ty:=yy; while x<=n do begin y:=ty; while y<=n do begin c[x,y]:=c[x,y]+opx; y:=y+lowbit(y); end; x:=x+lowbit(x); end; end; function query(x,y:longint):longint;//询问a二维矩阵a[]前缀和 var sum,ty:longint; begin sum:=0; ty:=y; while x>0 do begin y:=ty; while y>0 do begin sum:=sum+c[x,y]; y:=y-lowbit(y); end; x:=x-lowbit(x); end; exit(sum); end; begin readln(tt);//tt组数据 for ii:=1 to tt do begin readln(n,q);//n*n矩阵,q个操作 for i:=1 to q do begin read(ch);//ch为指示符 case ch of ‘C‘:begin readln(x1,y1,x2,y2); update(x1,y1,1); update(x1,y2+1,1); update(x2+1,y1,1); update(x2+1,y2+1,1);//4个橙色的点依次更改 end; ‘Q‘:begin readln(x,y); writeln(query(x,y) mod 2);end;//判断mod 2?=1 end; end; writeln; end; end.
我们来计算时间复杂度:
对于1次程序tt++前完成,q个询问,
如果是Q则复杂度是O(log n) 如果是C则复杂度为O(4 log n),最坏时间复杂度为O(4 log n)
那么对于1次完整的解决,我们最坏的时间复杂度为O (4q log n)
对于完整的tt次解决,最坏的时间复杂度是O(4*q*tt*log n)
2 <= N <= 1000, 1 <= q<= 50000; tt<=10;
那么最坏情况的常数为O(4*50000*10*10)=O(2000w)
没有超时,完美解决!
希望lsh+oycy大学霸orz能够早日用数学AC本题!
标签:logs 时间 desc img alt 测试 技术 整数 read
原文地址:http://www.cnblogs.com/ljc20020730/p/7207741.html