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 }
扫描二维码关注公众号,回复:
6954367 查看本文章
T2:跳房子
看到k的范围首先想到矩阵乘,但又看了看n和m还是算了
发现更改操作最多只会影响前面的三个点,于是就连边暴力跑,
又发现好像建出的图是n个点,n条边的有向图,那就必是一棵内向的基环树
很容易想到当k很大的时候就是一直在环上绕,所以可以对环的长度取一下模,复杂度就差不多了
T3:优美序列