【题目分析】

同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. HDU 1859

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

  2. (转载)解决GDI闪烁

    一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁. 先来谈谈闪烁产生的原因 原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的 ...

  3. Sicily 1153: 马的周游问题(DFS+剪枝)

    这道题没有找到一条回路,所以不能跟1152一样用数组储存后输出.我采用的方法是DFS加剪枝,直接DFS搜索会超时,优化的方法是在搜索是优先走出度小的路径,比如move1和move2都可以走,但是如走了 ...

  4. mac 关闭&&显示隐藏文件命令

    打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件 defaults write com.a ...

  5. proj.4 线程安全

    proj.4 线程安全 本文翻译自proj.4开发者文档 原文链接 http://proj4.org/development/threads.html 线程安全关键问题 全局变量pj_error是在线 ...

  6. C# I/O

    获取运行时的动态目录 private static string GetDataDir_Data() { var parent = Directory.GetParent(Directory.GetC ...

  7. iOS6_自动约束 Constraints

    取消Constraints(约束) 问题描述:xib文件设计的时候控件已经摆好位置,但是每次调试的时候控件的位置又乱了 解决方法:选中 xib文件,在右侧第一项(Identity and type)的 ...

  8. 3 Git服务器搭建

    1. 环境部署 系统环境:服务器端:CentOS 6.5 ,ip:192.168.56.1 客户端:CentOS 6.5 ,ip:192.168.56.101 软件版本:服务器端:源码编译安装,git ...

  9. 通过数组和枚举简化GPIO操作编码

    在工作中,经常遇到大量使用GPIO作为数字量输入输出来控制设备或采集状态,每次定义操作不同的GPIO针脚既麻烦又容易出错,于是就想要简化操作过程.对于数字量输入来说就是采集对应针脚的状态:而输出则是根 ...

  10. C# 使用AForge调用笔记本摄像头拍照

    vs2012  winform 连接摄像头设备,这里需要引入 代码: using AForge; using AForge.Controls; using AForge.Imaging; using ...