【题目分析】

同BZOJ2683,只需要提前处理s对结果的影响即可。

CDQ的思路还是很清晰的。

排序解决一维,

分治时间,

树状数组解决一维。

复杂度是两个log

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
//#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;

#define maxn 2000005

int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

struct data{
    int opt,id;
    int x,y,f,t;
}q[maxn],eq[maxn];

int ans[maxn],s;
int n,tot=0,cnt=0,opt,x1,y1,x2,y2,a;

struct Bit{
    int a[maxn];
    void init(){memset(a,0,sizeof a);}
    void add(int x,int f)
    {for (;x<=n;x+=x&(-x)) a[x]+=f;}
    int sum(int x)
    {
        int ret=0;
        for (;x;x-=x&(-x)) ret+=a[x];
        return ret;
    }
}t;

bool cmp(data a,data b)
{
    if (a.x==b.x&&a.y==b.y) return a.opt<b.opt;
    if (a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}

void solve(int l,int r)
{
    if (l==r) return ;
    int mid=(l+r)/2;
    for (int i=l;i<=r;++i)
    {
        if (q[i].t<=mid&&q[i].opt==1) t.add(q[i].y,q[i].f);
        if ( q[i].t>mid&&q[i].opt==2) ans[q[i].id]+=t.sum(q[i].y)*q[i].f;
    }
    for (int i=l;i<=r;++i)
        if (q[i].t<=mid&&q[i].opt==1) t.add(q[i].y,-q[i].f);
    int l1=l,l2=mid+1;
    for (int i=l;i<=r;++i) {if (q[i].t<=mid) eq[l1++]=q[i]; else eq[l2++]=q[i];}
    for (int i=l;i<=r;++i) q[i]=eq[i];
    solve(l,mid);
    solve(mid+1,r);
}

int main()
{
    s=read();n=read();
    while (scanf("%d",&opt)!=EOF&&opt!=3)
    {
        if (opt==1)
        {
            q[++cnt].opt=opt;
            q[cnt].x=read();
            q[cnt].y=read();
            q[cnt].f=read();
            q[cnt].t=cnt;
        }
        else
        {
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2); ++tot;
            ans[tot]+=(x2-x1+1)*(y2-y1+1)*s;
            q[++cnt].opt=opt; q[cnt].x=x1-1; q[cnt].y=y1-1; q[cnt].f=1;  q[cnt].t=cnt; q[cnt].id=tot;
            q[++cnt].opt=opt; q[cnt].x=x1-1; q[cnt].y=y2;   q[cnt].f=-1; q[cnt].t=cnt; q[cnt].id=tot;
            q[++cnt].opt=opt; q[cnt].x=x2;   q[cnt].y=y1-1; q[cnt].f=-1; q[cnt].t=cnt; q[cnt].id=tot;
            q[++cnt].opt=opt; q[cnt].x=x2;   q[cnt].y=y2;   q[cnt].f=1;  q[cnt].t=cnt; q[cnt].id=tot;
        }
    }
    sort(q+1,q+cnt+1,cmp);
    solve(1,cnt);
    for (int i=1;i<=tot;++i) printf("%d\n",ans[i]);
}

  

BZOJ 1176 [Balkan2007]Mokia ——CDQ分治的更多相关文章

  1. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  2. BZOJ 1176[Balkan2007]Mokia(CDQ分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3381  Solved: 1520[Submit][S ...

  3. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  4. BZOJ 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2012  Solved: 896[Submit][St ...

  5. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  6. bzoj 1176 [Balkan2007]Mokia 【CDQ分治】

    W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...

  7. BZOJ1176: [Balkan2007]Mokia CDQ分治

    最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...

  8. BZOJ 1176: [Balkan2007]Mokia KDtree

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...

  9. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

随机推荐

  1. javascript 获取滚动条高度+常用js页面宽度与高度

    /******************** * 取窗口滚动条高度  ******************/function getScrollTop(){    var scrollTop=0;    ...

  2. android微信分享不出去?四步搞定!

    现在做的项目中集成了友盟分享,产品要求集成微信.朋友圈.QQ.QQ空间.短信这几个分享平台.按照友盟的文档集成一切都很顺利,集成成功以后测试QQ.QQ空间.短信都没有问题,唯独微信和朋友圈一直分享不出 ...

  3. [转]undo log与redo log原理分析

    数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,这里主要是原子性和持久性,即事务相关的操作,要么全做,要么不做,并且修改的数据能得 ...

  4. apache 配虚拟主机转发到tomcat

    我用的是apache2.4.23, 连接tomcat使用自带的 proxy-ajp,需要开启相关模块 引用 http://www.server110.com/apache/201404/10273.h ...

  5. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决办法

    这个问题的原因是没有导入mysql连接库,我从官网上下载后照着网上的教程各种导入无果,最后发现是我导入的文件错了.... 官网上下下来的压缩文件是这个,不过这并不是直接要导入的文件,首先解压文件,然后 ...

  6. Lr IP欺骗设置

    IP欺骗设置IP工具:IP Wizard 开启IP欺骗时会关闭DHCP(也就是关闭IP自动获取 更改为手动设置IP) 注:添加IP欺骗,和释放IP,都要重启机器后才会生效,IP Wizard要管理员身 ...

  7. Python 2/3 安装与运行环境设置

    Python 2/3 安装与运行环境设置: 1.Python 软件源:https://www.python.org/    下载Win版本 https://www.python.org/downloa ...

  8. 如何将Sphinx生成的html文档集成进入Django

    参考 http://stackoverflow.com/questions/10594618/django-and-sphinx-how-to-view-the-html-sphinx-generat ...

  9. Python之美--Decorator深入详解

    转自:http://www.cnblogs.com/SeasonLee/archive/2010/04/24/1719444.html 一些往事 在正式进入Decorator话题之前,请允许我讲一个小 ...

  10. jquery的checkbox,radio,select等方法总结

    jquery的checkbox,radio,和select是jquery操作的一个难点和重点,很多前端新手对其了解不是很透彻.时间久了不用,我在写的时候有时也难免对某些操作支支吾吾,记不清楚,现在,对 ...