タスク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。