noip模拟测试13


T1:矩阵游戏

  刚看题一脸懵,感觉一点思路都没有……

  然后就开始看题目,发现题目描述里似乎藏着什么东西???

  感觉题目闲的无聊疯狂描述了一个极其简单的东西,好像在暗示着什么!

  所以就把题目中的式子写下来——$(i-1)*m+j$

  再用这个式子把答案表示出来——$\sum_{i=1}^nR_i\sum_{j=1}^mS_j[(i-1)*m+j]$

  然后把含有$i$的项拆出来就可以$O(n)$做了

  

  so,code

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<vector>
 7 #define ll long long
 8 using namespace std;
 9 const int MAXN=1000005,MAXK=100005,D=1e9+7;
10 int n,m,k;
11 ll sums,sumr,s[MAXN],r[MAXN],ans,tmp,sum;
12 char opt[5];
13 int main() {
14     scanf("%d%d%d",&n,&m,&k);
15     for(int i=1;i<=m;i++) s[i]=1;
16     for(int i=1;i<=n;i++) r[i]=1;
17     for(int i=1;i<=k;i++) {
18         ll x,y;
19         scanf("%s%lld%lld",opt,&x,&y);
20         if(opt[0]=='R') r[x]=r[x]*y%D;
21         else s[x]=s[x]*y%D;
22     }
23     for(int i=1;i<=m;i++) sums=(sums+s[i])%D;
24     for(int i=1;i<=m;i++) tmp=(tmp+s[i]*i)%D;
25     for(int i=1;i<=n;i++) ans=(ans+(tmp+(ll)(i-1)*m%D*sums)%D*r[i]%D)%D;
26     printf("%lld\n",(ans%D+D)%D);
27     return 0;
28 }
t1 Code


T2:跳房子

   看到k的范围首先想到矩阵乘,但又看了看n和m还是算了

  发现更改操作最多只会影响前面的三个点,于是就连边暴力跑,

  又发现好像建出的图是n个点,n条边的有向图,那就必是一棵内向的基环树

  很容易想到当k很大的时候就是一直在环上绕,所以可以对环的长度取一下模,复杂度就差不多了

  



T3:优美序列


猜你喜欢

转载自www.cnblogs.com/Gkeng/p/11302156.html