Codeforces 407C Codeforces Round #239 (Div. 1)C

来源:互联网 发布:淘宝口红哪家是正品 编辑:程序博客网 时间:2024/05/28 15:22

题意:给出一个起始数组,有m个操作,每个操作能给  [l,r] 区间上的元素加上一个值   li ≤ j ≤ ri。

思路:

每次 操作 在 l的位置上 对应的位置加上 

C[k][k]  ,C[k][k-1]......C[k][0]

在最后统计的时候

在此次操作中 l+1 的元素加的值 C[k+1][k]=C[k][k]+C[k][k-1]

       l+2                       C[k+2][k]=C[k+1][k]+C[k+1][k-1]

......

只要一个递推就可以 效率为O(n*100)

这样算的话 到第 r+1也会加上C[k+r-l+1][k] 那么就需要在 r+1 行处对应的位置减去

C[k+r-l+1][k] ,C[k+r-l+1][k-1].......C[k+r-l+1][0]

最后再进行 统计。

代码:


#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>#include<map>#include<queue>#define MOD 1000000007#define Inf 1000000000#define eps 1e-8#define N 100050#define M 100050#define LL __int64using namespace std;int c[N][110];int f[N][110];int a[N];int d[N];int add(int x,int y){x+=y;if(x>=MOD)x-=MOD;if(x<0)x+=MOD;return x;}int main() {int n,m,i,j;for(i=0;i<=100000;i++){c[i][0]=1;if(i<=100)c[i][i]=1;}for(i=2;i<=100000;i++){for(j=1;j<i&&j<=100;j++){c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;}}scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&a[i]);memset(f,0,sizeof(f));while(m--){int l,r,k;scanf("%d%d%d",&l,&r,&k);for(i=0;i<=k;i++){f[l][i]=add(f[l][i],c[k][k-i]);f[r+1][i]=add(f[r+1][i],-c[k+r-l+1][k-i]);}}memset(d,0,sizeof(d));for(i=1;i<=n;i++){for(j=0;j<=100;j++)d[j]=add(d[j],f[i][j]);a[i]=add(a[i],d[0]);for(j=0;j<100;j++)d[j]=add(d[j],d[j+1]);}for(i=1;i<=n;i++){printf("%d",a[i]);if(i!=n)printf(" ");else puts("");}}




0 0