Advertisement

上海计算机学会2022年11月月赛C++乙组T2加与乘(一)

阅读量:

加与乘(一)

内存限制: 256 Mb时间限制: 1000 ms

题目描述

有 n 个存储单元,一开始,所有单元都是 0,接下来依次进行 q 条修改操作:

  • 加法修改操作以字符 + 开头,后接两个整数 p 与 d,表示第 p 个单元将增加 d;
  • 乘法修改操作以字符 * 开头,后接一个整数 m,表示所有单元都将变成原数字的 m 倍。

请输出每个单元最后的数值。由于答案可能很大,输出这些数各自模 1,000,000,007 的余数。

输入格式
  • 第一行:两个整数表示 n 与 q。
  • 第二行到第 q+1 行:第 i+1 行首先有一个字符表示操作类型
    • 若是加法修改,后接两个整数 pi​ 与 di​
    • 若是乘法修改,后接一个整数 mi​
输出格式
  • 单独一行:n 个数字,表示各单元模 1,000,000,007 的余数。
数据范围
  • 对于 40% 的数据,n,q≤1000
  • 对于 80% 的数据,n,q≤50000
  • 对于 100% 的数据,n,q≤200,000
  • 1≤di​,mi​≤1,000,000
样例数据

输入:
3 5
+ 1 3

  • 10
    + 2 6
    + 3 9
  • 5
    输出:
    150 30 45

解析:

详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int n,q;
    
 long long a[200005];//数
    
 char op[200005];//操作符号
    
 long long p[200005];
    
 long long d[200005];
    
 long long m[200005];
    
 long long mod=1000000007;
    
 long long b=1;//倍数
    
 int main()
    
 {
    
     cin>>n>>q;
    
     for(int i=1;i<=q;i++){
    
     cin>>op[i];
    
     if (op[i]=='+'){
    
         cin>>p[i]>>d[i];
    
     }else{
    
         cin>>m[i];
    
     }
    
     }
    
     for(int i=q;i>=1;i--){//从后往前循环
    
     if (op[i]=='*'){//如果是乘,b变成之前所有数的倍数
    
         b*=m[i];
    
         b%=mod;
    
     }else {//加就加上数乘以它往后的所有倍数
    
         a[p[i]]+=d[i]*b;
    
         a[p[i]]%=mod;
    
     }
    
     }
    
     for(int i=1;i<=n;i++){
    
     cout<<a[i]<<" ";
    
     }
    
     return 0;
    
  
    
 }
    
    
    
    
    AI写代码cpp
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-30/PA32NYrCZ46sIhayXFuvtcjqMBoU.png)

全部评论 (0)

还没有任何评论哟~