题意
有三种操作:
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;
}