洛谷——P3801 红色的幻想乡

P3801 红色的幻想乡

 

推荐阅读 https://blog.csdn.net/qq_41252892/article/details/79035942

非常清楚

 

线段树单点修改

emmm没什么了

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>

#define N 320202
using namespace std;

int tr_h[N],tr_l[N];

int n,m,q;

void push(int *tr,int k) {
    tr[k]=tr[k<<1]+tr[k<<1|1];
}

void change(int *tr,int k,int l,int r,int X) {
    int mid=(l+r)>>1;
    if(l==r) {
        tr[k]^=1;
        return;
    }
    if(X<=mid) change(tr,k<<1,l,mid,X);
    else change(tr,k<<1|1,mid+1,r,X);
    push(tr,k);
}

int ask(int *tr,int k,int l,int r,int ql,int qr) {
    int mid=(l+r)>>1;
    if(ql<=l&&qr>=r) return tr[k];
    int ans=0;
    if(ql<=mid) ans+=ask(tr,k<<1,l,mid,ql,qr);
    if(qr>mid) ans+=ask(tr,k<<1|1,mid+1,r,ql,qr);
    push(tr,k);
    return ans;
}

int main() {
    scanf("%d%d%d",&n,&m,&q);

    for(int opt,x_1,x_2,y_1,y_2,i=1; i<=q; i++) {
        scanf("%d",&opt);
        if(opt==1) {
            scanf("%d%d",&x_1,&x_2);
            change(tr_h,1,1,n,x_1);
            change(tr_l,1,1,n,x_2);
        }else{
            scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2);
            int xx=ask(tr_h,1,1,n,x_1,x_2),yy=ask(tr_l,1,1,n,y_1,y_2);
            printf("%lld\n",1ll*xx*(y_2-y_1+1)+1ll*yy*(x_2-x_1+1)-1ll*2*xx*yy);
        }
    }
    
    return 0;
}

 

posted @ 2018-10-29 21:01  清风我已逝  阅读(236)  评论(1编辑  收藏  举报