c-小w的糖果题解(牛客练习赛48)

题意

有三种操作:

1.从当前pos开始每个位置加1。

2.从当前pos开始每个位置加x。

3.从当前pos开始每个位置加x2。

然后有t组数据,每组有n,m,n表示个数,m表示操作数,接下来有m行 type pos 操作和起始位置。

对于区间加上ax+b,ax2+bx+c这个的可以先看一下这个某个区间加一次函数、二次函数

AC代码

#include<bits/stdc++.h>
using namespace std;
const int man = 1e5+10;
const int mod = 1e9+7;
int a[man],b[man],c[man];

void get_mod(int *d,int n){
    for(int i = 1;i <= n;i++){
        d[i] = (d[i-1]+d[i])%mod;
    }
}

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
  	memset(c,0,sizeof(c));
        scanf("%d%d",&n,&m);
        for(int i = 1;i <=m;i++){
            int pos,type;
            scanf("%d%d",&type,&pos);
            if(type==1){
                a[pos]++;
            }else if(type==2){
                b[pos]++;
            }else{
                c[pos]++;
                c[pos+1]++;//上面那个链接讲解了
            }
        }
        get_mod(a,n);
        for(int i = 1;i <= 2;i++)get_mod(b,n);
        for(int i = 1;i <= 3;i++)get_mod(c,n);
        for(int i =1 ;i <=n;i++)printf(i==n?"%d\n":"%d ",(a[i]+b[i]+c[i])%mod);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值