codechef September Challenge 2017 Sereja and Commands

————————————————————————————

这道题维护一下原序列的差分以及操作的差分就可以了 

记得倒着差分操作 因为题目保证操作2的l r 小与当前位置

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) x&-x;
using namespace std;
const int M=1e5+7,mod=1e9+7;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
    return ans*f;
}
int T,n,m;
int s[M],f[M];
struct pos{int k,l,r;}q[M];
void clear(){
    memset(s,0,sizeof(s)); 
    memset(f,0,sizeof(f));
}
int main(){
    T=read();
    while(T--){
        n=read(); m=read(); clear();
        for(int i=1;i<=m;i++) q[i].k=read(),q[i].l=read(),q[i].r=read();
        f[m]=1;
        for(int i=m;i;i--){
            int k=q[i].k,l=q[i].l,r=q[i].r;
            if(k==1){
                s[l]=(s[l]+f[i])%mod;
                s[r+1]=(s[r+1]-f[i])%mod;
            }
            else{
                f[l-1]=(f[l-1]-f[i])%mod;
                f[r]=(f[r]+f[i])%mod;
            }
            f[i-1]=(f[i-1]+f[i])%mod;
        }
        int sum=0;
        for(int i=1;i<=n;i++) sum=(sum+s[i])%mod,printf("%d ",(sum+mod)%mod); puts("");
    }    
    return 0;
}
View Code

 

posted @ 2017-09-14 19:04  友人Aqwq  阅读(169)  评论(0编辑  收藏  举报