cogs——1008. 贪婪大陆(清华巨佬代码)——树状数组

1008. 贪婪大陆

★★   输入文件:greedisland.in   输出文件:greedisland.out   简单对比
时间限制:1 s   内存限制:128 MB



 

 

 

 

 

 

 



 

 

 

 

 

 

 

 

 

 

 

#include<cstdio>

const int MAXN(100010);

int n,m,tot;
int t[MAXN<<2][2];

void insert(int x,int k,int left=1,int right=n,int p=1){
    if(left==right){
        t[p][k]++;
        return;
    }
    int mid=(left+right)>>1;
    if(x<=mid)insert(x,k,left,mid,p<<1);
    else insert(x,k,mid+1,right,p<<1|1);
    t[p][0]=t[p<<1][0]+t[p<<1|1][0];
    t[p][1]=t[p<<1][1]+t[p<<1|1][1];
}
int query(int x,int y,int k,int left=1,int right=n,int p=1){
    if(x<=left&&right<=y)
        return t[p][k];
    int mid=(left+right)>>1,ans=0;
    if(x<=mid)ans=ans+query(x,y,k,left,mid,p<<1);
    if(y>mid)ans=ans+query(x,y,k,mid+1,right,p<<1|1);
    return ans;
}

int main(){
    freopen("greedisland.in","r",stdin);
    freopen("greedisland.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int q=1;q<=m;q++){
        int ty,x,y;
        scanf("%d%d%d",&ty,&x,&y);
        if(ty==1){
            insert(x,0);
            insert(y,1);
            tot++;
        }
        else
            printf("%d\n",tot-query(1,x-1,1)-query(y+1,n,0));
    }
    return 0;
}

two

#include<cstdio>

const int MAXN(100010);

int n,m,tot;
int t[MAXN<<2],tag[MAXN<<2],mark[MAXN<<2];

void increase(int p,int k){
    t[p]+=k;
    tag[p]+=k;
    mark[p]+=k;
}

void push_down(int p){
    int& d=tag[p];
    increase(p<<1,d);
    increase(p<<1|1,d);
    d=0;
}

void insert(int x,int y,int left=1,int right=n,int p=1){
    if(x<=left&&right<=y){
        increase(p,1);
        return;
    }
    push_down(p);
    int mid=(left+right)>>1;
    if(x<=mid)insert(x,y,left,mid,p<<1);
    if(y>mid) insert(x,y,mid+1,right,p<<1|1);
    t[p]++;
    if(x<=mid&&y>mid)mark[p]++;
}
int query(int x,int y,int left=1,int right=n,int p=1){
    if(x<=left&&right<=y)
        return t[p];
    push_down(p);
    int mid=(left+right)>>1,ans=0;
    if(x<=mid)ans=ans+query(x,y,left,mid,p<<1);
    if(y>mid)ans=ans+query(x,y,mid+1,right,p<<1|1);
    if(x<=mid&&y>mid)ans-=mark[p];
    return ans;
}

int main(){
    freopen("greedisland.in","r",stdin);
    freopen("greedisland.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int q=1;q<=m;q++){
        int ty,x,y;
        scanf("%d%d%d",&ty,&x,&y);
        if(ty==1)
            insert(x,y);
        else
            printf("%d\n",query(x,y));
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/6797580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值