题目链接

昨天mhr神犇,讲分治时的CDQ分治的入门题。

题意:

你又一个w*w正方形的田地。

初始时没有蝗虫。

给你两个操作:

1. 1 x y z: (x,y)这个位置多了z只蝗虫。

2. 2 x1 y1 x2 y2: 询问(x1,y1)到(x2,y2)这个矩形内的蝗虫数量。

其中 W<=500000,操作数<=200000 。

题解:

w范围太大,无法使用二维数据结构。

于是我们可以分治操作。

CDQ分治:定义 solve(l,r)

设m=(l+r)/2;

先计算 l…m 修改操作对 m+1…r 查询的影响,然后递归solve(l,m);solve(m+1,r);

solve(x,x)时停止。

这样递归到底后每个询问操作也得到了应该的答案。

有一个好处是在计算l…m 修改操作对 m+1…r 查询的影响时,因为修改都发生在查询之前,那么修改操作之间的顺序就没有那么重要了。

于是可以按x坐标排序,运用扫描线的思想,用一维树状数组解决这个问题。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define lowbit(x) ((x)&-(x))
using namespace std;
struct N{
    int t,x1,y1,x2,y2,z,num;
};
N Q[];
];
int w,n;
N c[];int cc;
bool cmp(N a,N b){
    if(a.x1==b.x1) return a.t<b.t;
    return a.x1<b.x1;
}
];
void add(int pos,int a){
    while(pos<=w){
        tree[pos]+=a;
        pos+=lowbit(pos);
    }
}
int ask(int pos){
    ;
    ){
        ret+=tree[pos];
        pos-=lowbit(pos);
    }
    return ret;
}
void solve(int l,int r){
    if(l==r) return ;
    ;
    cc=;
    for(int i=l;i<=m;i++){
        ){
            c[cc++]=Q[i];
        }
    }
    ;i<=r;i++){
        if(Q[i].t){
            c[cc++]=Q[i];
            c[cc++]=Q[i];
            c[cc-].x1--;
            c[cc-].x1=c[cc-].x2;
            c[cc-].t=;
        }
    }
    sort(c,c+cc,cmp);
    ;i<cc;i++){
        ){
            add(c[i].y1,c[i].z);
        }){
            ans[c[i].num]-=ask(c[i].y2)-ask(c[i].y1-);
        }else{
            ans[c[i].num]+=ask(c[i].y2)-ask(c[i].y1-);
        }
    }
    ;i<cc;i++){
        ){
            add(c[i].y1,-c[i].z);
        }
    }
    solve(l,m);solve(m+,r);
}
int main(){
    freopen("locust.in","r",stdin);
    freopen("locust.out","w",stdout);
    scanf("%d%d",&w,&n);
    ,x1,y1,x2,y2;i<=n;i++){
        Q[i].num=i;
        scanf("%d",&Q[i].t);
        Q[i].t--;
        ){
            scanf("%d%d%d",&Q[i].x1,&Q[i].y1,&Q[i].z);
        }else{
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            Q[i].x1=min(x1,x2);
            Q[i].x2=max(x1,x2);
            Q[i].y1=min(y1,y2);
            Q[i].y2=max(y1,y2);
        }
    }
    solve(,n);
    ;i<=n;i++){
        if(Q[i].t) printf("%d\n",ans[i]);
    }
    ;
}

COGS 577 蝗灾 [CDQ分治入门题]的更多相关文章

  1. cogs 577 蝗灾 CDQ分治

    第一道CDQ,抄了下helenkeller的代码,感觉和归并排序差不多... 因为左半边的修改肯定在右半边的询问之前,所以就不用管时间的限制了,可以直接x轴排序树状数组处理y轴... #include ...

  2. bzoj3262陌上花开 cdq分治入门题

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  3. CDQ分治入门 + 例题 Arnooks's Defensive Line [Uva live 5871]

    CDQ分治入门 简介 CDQ分治是一种特别的分治方法,它由CDQ(陈丹琦)神犇于09国家集训队作业中首次提出,因此得名.CDQ分治属于分治的一种.它一般只能处理非强制在线的问题,除此之外这个算法作为某 ...

  4. COGS 577 蝗灾 线段树+CDQ分治

    第一次写cdq分治 感谢hhd&lty 这20亿对CP的指导(逃) 其实 就是 递归看左半部分对右半部分的贡献 (树状数组写挂了--临时改的线段树[大写的尴尬]) //By SiriusRen ...

  5. cdq分治入门学习 cogs 1752 Mokia nwerc 2015-2016 G 二维偏序

    /* CDQ分治的对象是时间. 即对于一个时间段[L, R],我们取mid = (L + R) / 2. 分治的每层只考虑mid之前的修改对mid之后的查询的贡献,然后递归到[L,mid],(mid, ...

  6. COGS 577 蝗灾

    传送门 时间限制:2 s 内存限制:128 MB DESCRIPTION C国国土辽阔,地大物博......但是最近却在闹蝗灾..... 我们可以把C国国土当成一个W×W的矩阵,你会收到一些诸如(X, ...

  7. cdq分治入门and持续学习orz

    感觉cdq分治是一个很有趣的算法 能将很多需要套数据结构的题通过离线来做 目前的一些微小的理解 在一般情况下 就像求三维偏序xyz 就可以先对x排序 然后分治 1 cdq_x(L,M) ; 2 提取出 ...

  8. CDQ分治入门

    前言 \(CDQ\)分治是一个神奇的算法. 它有着广泛的用途,甚至在某些题目中还能取代\(KD-Tree\).树套树等恶心的数据结构成为正解,而且常数还小得多. 不过它也有一定的缺点,如必须离线操作, ...

  9. caioj1097: [视频]树状数组1(快速求和计算) cdq分治入门

    这题虽然是个树状数组,但是也可以用cdq分治做啊~~,这个就是一个浅显的二维偏序的应用? cdq分治和普通的分治有什么区别? 举个栗子:有4个小朋友,你请他们吃饭,假如你分治搞,就会分成很多子问题—— ...

随机推荐

  1. 关于AFNetworking访问网络超时的设置

    前言:有的猿会发现在设置AFNetworking访问网络超时时,直接用self.manager.requestSerializer.timeoutInterval =10.f不起作用. 解决办法:经过 ...

  2. Java client 访问 memcached

    在测试项目中引入了memcached作为缓存层,以下是memcached的缓存配置和调用过程. linux下memcached安装过程 直接参考以前的博文linux下安装memcached过程  不再 ...

  3. verilog语法:进程名

    always @ (posedge clk, negedge rstn)begin:State_flipflops if(!rstn) y<=S1; else y<=Y;end请问这段程序 ...

  4. win8 64位操作系统 Microsoft Visual Studio 2010在IIS上调试 “此任务要求应用程序具有提升的权限”等问题

    很少在IIS上调试程序,因系统原因,所以不得不在IIS上预览项目和调试项目(因为只能在IIS上预览项目才能看到项目里的数据). 1.附加到进程(注意附加到进程前必须预览项目) 2.选择调试项 需要注意 ...

  5. Javaweb入门20160301 ---xml入门

    一.xml语法 1.文档声明 用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml 通常一个xml都要包含并且只能包含一个文档声明 xml的文档必须在整个xml的最前面,在文档声明之前不能有 ...

  6. javaScripte 创建对象。。

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. 10_Mybatis开发Dao方法——mapper代理实现

    [工程截图(几个关键的标红框)] [UserMapper.xml] <?xml version="1.0" encoding="UTF-8"?> & ...

  8. The Wonderful Wizard of Oz-绿野仙踪-(音频+文本)-英文版本

    Audio: http://www.booksshouldbefree.com/book/the-wonderful-wizard-of-oz Books: http://www.gutenberg. ...

  9. Gradle教程之任务管理

    简要概述依赖管理 不算完美的依赖管理技术 自动管理依赖的重要性 自动依赖管理面临的挑战 声明依赖 外部模块依赖 文件依赖 配置远程仓库 这一章我将介绍Gradle对依赖管理的强大支持,学习依赖分组和定 ...

  10. atc游戏bot

    游戏玩起来太虐心了,就写了个bot来玩, 代码在此: git clone https://github.com/chenfengyuan/atc-bot-new.gitgit clone https: ...