CODECHEF Sereja and Commands

来源:互联网 发布:学生怒骂日本记者知乎 编辑:程序博客网 时间:2024/05/22 11:59

题目链接:https://www.codechef.com/SEPT17/problems/SEACO
树状数组,倒着处理
因为数字更新可能为负,所以取模要注意
贴代码

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn=100005,P=1000000007;int b[maxn],c[maxn];int n,m,Q;struct rc{    int t,l,r;}a[maxn];int lowbit(int x){    return x&(-x);}void data_1(int x,int y){    for (int i=x;i<=m;i+=lowbit(i))b[i]=(ll(b[i])+ll(y)+ll(P))%ll(P);}void data_2(int x,int y){    for (int i=x;i<=n;i+=lowbit(i))c[i]=(ll(c[i])+ll(y)+ll(P))%ll(P);}int query_1(int x){    int s=0;    for (int i=x;i>=1;i-=lowbit(i))s=(ll(s)+ll(b[i])+ll(P))%ll(P);    return s;}int query_2(int x){    int s=0;    for (int i=x;i>=1;i-=lowbit(i))s=(ll(s)+ll(c[i])+ll(P))%ll(P);    return s;}int main(){//  freopen("5.in","r",stdin);//  freopen("5.out","w",stdout);    scanf("%d",&Q);    while (Q--){        scanf("%d%d",&n,&m);        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        for (int i=1;i<=m;i++)scanf("%d%d%d",&a[i].t,&a[i].l,&a[i].r);        for (int i=m;i>=1;i--){            if (a[i].t==1){                int x=query_1(i)+1;                data_2(a[i].l,x);data_2(a[i].r+1,-x);            }else{                int x=query_1(i)+1;                data_1(a[i].l,x);data_1(a[i].r+1,-x);            }        }        for (int i=1;i<=n;i++)printf("%d ",query_2(i));        printf("\n");    }    return 0;}

【写的有漏洞的,欢迎路过大神吐槽】
2017/09/11 19:38:13
Ending.

原创粉丝点击