グループ19.8.5を試験Jizhongを改善する[シミュレーションゲーム]

タスク1.マトリックスゲーム


タイトル効果:N行M列の行列、最初の行番号1 2 3 ... M-1 mで 、 第2の行M + 1、M + 2、M + 3 ... 2M-1 2M、 順次同様に、i番目(I-1)M + 1の挙動 (I-1)M + 2(I-1)M + 3···(I-1)M + M-1(I-1)M + m個二次操作、デジタルマトリックス及びK(MOD 10は、この行列の最初の行の各操作後、またはCを乗じたX番目の列のすべての数値をX、すべての操作は必要あり9 +7)を。

データ領域:1≦N、M≤10 6。、1≤K≤10

もちろん、動作の順序は重要ではありませんので、我々は個別に行と列の操作の操作を置きます。

R&LTが設けiは数で、i行目で、S iが、すべてのR&LTの数を乗じたI番目の列であり、I S I初めの両方1です。

暴力の一種80件のアイデア:

1行目のすべての処理操作は、すべての行を直接カラムの操作の結果を考慮せずに計算し、加えて、すべての列とS乗算Iはそう、-1をもたらす第一の位置(x、y)のため結果は、R&LTカウントするX秒の結果は、Sで計算され、時間をY -1回。そのような位置は(R&LTのカウントされるX + S Y -1)回、またはしない影響操作回だけカウント(R&LT X = 1、S Y = 1)、動作はいずれかの影響(R&LT X = C、S Yが= 1、又はR&LT X = 1、S Y = C)は、2つ(R&LTのいずれかの動作に影響X = C、S Y = D)を。そのような寄与は交点R&LTの点であるべきであるX * S Y、マイナス交差部Kの数までマルチオペレータプラス前面の実際の直接寄与、2 番目。Oの複雑さ(N + M K + 2 )。

正解:

ボトルネック80のアプローチの複雑さは、そこに列挙のための有効な方法があるか、実際の交差点の交差点を考慮していないかどうか、という交差点の列挙ですか?

マトリックスを観察することによって、我々は、操作が表示されていない場合に各列を見つけ、(我々はフラットビートマトリックスを想像)等差数列を形成します。この時間は、上記の操作と相まって場合、我々はシリーズが直接変更された項目に指示することができます。

ラインのメンテナンスとプレフィックスと耐性、寛容、両演算の進行上にある最初のアイテムの最初のアイテム、列挙した各。O(N + M)の複雑。

コード:

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <アルゴリズム>
 4  使って 名前空間STDを、
5  
6テンプレート< クラス T> ボイドリード(T&X){
 7      、X = 0チャー C = GETCHAR()。
8      一方、(C < ' 0 ' || ' 9 ' <C)C = GETCHAR()。
9      一方' 0 ' <= C && C <= '){X =(X << 1)+(X << 3)+(C ^ 48)。C = GETCHAR();}
 10  }
 11のtypedef 長い LL。
12  のconst  int型 N = 1000050 13  のconst  int型 M = 十億七14 LLのMUL(int型のx、int型の Y){ リターン(1LL * X * Y)%のM;}
 15  
16  int型N、M、K。
17  のint R [N]、S [N]。
18  int型A、D、ANS。
19  INT メイン(){
20  //     freopenは( "game.in"、 "R"、STDIN)。
21  //     freopenは( "game.out"、 "W"、STDOUT)。
22      リード(N)(m)を読み出します。(k)を読み出します。
23      のためにint型 I = MAX(N、M); I; I - )R [I] = sの[I] = 1 24      チャー OP [ 3 ]。int型のx、C;
25      のためにint型 i = 1 ; iが= Kを<; Iは++ ){
 26          のscanf(" %sの" 、OP)。
27          リード(X)。(C)を読み取ります。
28          であれば(OP [ 0 ] == ' R')R [X] = MUL(R [X]、c)を、
29           sが[X] = MUL(S [X]、C)。
30      }
 31      のためのint型 i = 1 ; iがn = <; iは++ ){
 32          =(1LL * A +((MUL 1LL *(I- 1)* M + 1)%のM、R [I]))%M;
33          、D =(D + R [I])%のM。
34      }
 35      のためのint型 I = 1 ; I <= M; iが++ ){
 36件          のANS =(1LL * ANS + MUL(S [I]))%Mと、
37          =(+ d)は%M。
38      }
 39     printf(" %d個の\ n " 、ANS)。
40      リターン 0 ;
41 }
〜同じ〜

PS:人によって教え1LL。

おすすめ

転載: www.cnblogs.com/opethrax/p/11303600.html