[思维] Jzoj P6277 矩阵游戏

Description

Input

Output

Sample Input

Sample Input1
3 4 4
R 2 4
S 4 1
R 3 2
R 2 0

Sample Input2
2 4 4
S 2 0
S 2 3
R 1 5
S 1 3

Sample Output

Sample Output1
94

Sample Output2
80

Data Constraint

Hint

 

 

题解

  • 我们发现对于每一行的操作之后相邻两列的和之间的公差是相等的,并且后一列的和比前一列的和大
  • 因此对于行的操作我们可以维护前两列,作出公差,之后再得出每一列的和,再乘上每一列的系数即可

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #define ll long long
 5 using namespace std;
 6 const ll N=1e6+10,mo=1e9+7;
 7 char s[5];
 8 ll n,m,k,cnt,ans,r,sum[N],a[N],b[N];
 9 struct node { ll x,y; }p[N]; 
10 int main()
11 {
12     freopen("game.in","r",stdin),freopen("game.out","w",stdout),scanf("%lld%lld%lld",&n,&m,&k); for (ll i=1;i<=n;i++) a[i]=((i-1)*m+1)%mo,b[i]=1;
13     for (ll i=1,x,y;i<=k;i++)
14     {
15         scanf("%s%lld%lld",s,&x,&y);
16         if (s[0]=='S') { p[++cnt]=(node){x,y}; continue; }
17         a[x]=a[x]*y%mo,b[x]=b[x]*y%mo;
18     }
19     for (ll i=1;i<=n;i++) sum[1]=(sum[1]+a[i])%mo,r=(r+b[i])%mo;
20     for (ll i=2;i<=m;i++) sum[i]=(sum[i-1]+r)%mo;
21     for (ll i=1;i<=cnt;i++) sum[p[i].x]=(sum[p[i].x]*p[i].y)%mo;
22     for (ll i=1;i<=m;i++) (ans+=sum[i])%=mo;
23     printf("%lld",ans);
24 }

 

posted @ 2019-08-06 10:40  BEYang_Z  阅读(266)  评论(0编辑  收藏  举报