对w*w,w<=2000000的矩形,一开始全是0(或一开始全是s),n<=170000个操作,每次操作:矩阵内某点加上一个数,查某一个子矩阵的和,保证修改数<=160000,询问数<=10000。

这还是一个比较明显的三维偏序:时间维,以及x和y。由于现在时间维是一个Ti<Tj,而x和y是要查x1<=x<=x2,y1<=y<=y2,查一个范围答案在归并排序直接查不方便,所以一个询问拆4个,就变成普通的三维偏序了。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,m,s;
#define maxn 300011
#define maxm 2000011
struct Point
{
int x,y,v;bool type;
//type=1:Q type=0:A
}a[maxn];
int ans[maxn]; struct BIT
{
int a[maxm],n;
void clear(int m) {n=m;memset(a,,sizeof(a));}
void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;}
int query(int x) {int ans=;for (;x;x-=x&-x) ans+=a[x];return ans;}
}t; int ord[maxn],tmpord[maxn];
void solve(int L,int R)
{
if (L==R) {ord[L]=L;return;}
const int mid=(L+R)>>;
solve(L,mid);
solve(mid+,R);
int i=L,j=mid+,k=L;
while (i<=mid && j<=R)
{
if (a[ord[i]].x<=a[ord[j]].x)
{
if (a[ord[i]].type==)
t.add(a[ord[i]].y,a[ord[i]].v);
tmpord[k++]=ord[i++];
}
else
{
if (a[ord[j]].type)
ans[ord[j]]+=t.query(a[ord[j]].y);
tmpord[k++]=ord[j++];
}
}
for (;j<=R;j++)
{
if (a[ord[j]].type) ans[ord[j]]+=t.query(a[ord[j]].y);
tmpord[k++]=ord[j];
}
for (int ii=L;ii<i;ii++) if (!a[ord[ii]].type) t.add(a[ord[ii]].y,-a[ord[ii]].v);
for (;i<=mid;i++) tmpord[k++]=ord[i];
for (int x=L;x<=R;x++) ord[x]=tmpord[x];
} int main()
{
scanf("%d%d",&s,&m);
t.clear(m);
n=;
int op,x,y,z,w;
while (scanf("%d",&op) && op!=)
{
if (op-)
{
scanf("%d%d%d%d",&x,&y,&z,&w);
a[++n]=(Point){x-,y-,,};
a[++n]=(Point){x-,w,-,};
a[++n]=(Point){z,y-,-,};
a[++n]=(Point){z,w,,};
}
else
{
scanf("%d%d%d",&x,&y,&z);
a[++n]=(Point){x,y,z,};
}
}
solve(,n); for (int i=;i<=n;i++) if (a[i].type)
{
int Ans=;
for (int to=i+;i<to;i++) Ans+=ans[i]*a[i].v;
i--;
printf("%d\n",Ans);
}
return ;
}

这题面的s没有用,怎么题面也不改。。

cdq分治入门--BZOJ1176: [Balkan2007]Mokia的更多相关文章

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

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

  2. bzoj1176: [Balkan2007]Mokia【cdq分治】

    把询问搞成4个,cdq分治. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a;i <= b; i++) #d ...

  3. BZOJ1176 [Balkan2007]Mokia 【CDQ分治】

    题目 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. 输入格式 ...

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

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

  5. [BZOJ1176][Balkan2007]Mokia cdq+树状数组

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

  6. COGS 577 蝗灾 [CDQ分治入门题]

    题目链接 昨天mhr神犇,讲分治时的CDQ分治的入门题. 题意: 你又一个w*w正方形的田地. 初始时没有蝗虫. 给你两个操作: 1. 1 x y z: (x,y)这个位置多了z只蝗虫. 2. 2 x ...

  7. Bzoj1176 [Balkan2007]Mokia

    Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2000  Solved: 890 Description 维护一个W*W的矩阵,初始值均为S.每次操作 ...

  8. bzoj千题计划144:bzoj1176: [Balkan2007]Mokia

    http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ分治 #include<cstdio> #include<iostre ...

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

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

随机推荐

  1. 446 Arithmetic Slices II - Subsequence 算数切片之二 - 子序列

    详见:https://leetcode.com/problems/arithmetic-slices-ii-subsequence/description/ C++: class Solution { ...

  2. HDU 5996 博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=5996 博弈论待补. 这题变化了一下,因为注意到奇数层的东西(层数从1开始),对手可以模仿地动,那就相当于没动. ...

  3. 转】在Ubuntu中安装Redis

    不多说,直接上干货! 原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/ 感谢! 在Ubuntu中安装Redis R利剑 ...

  4. 解决asp.net 以及MVC中上传文件大小限制的问题

    ﹤system.web﹥ ﹤httpruntime requestlengthdiskthreshold="256" maxrequestlength="2097151& ...

  5. Spring注解驱动开发之声明式事务

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  6. AJPFX关于StringBuffer类的总结

    StringBuffer类一.字符串缓冲区,是一个容器.没有子类不能继承.特点:长度可变化:可操作多个数据类型:可通过toString()变成字符串.二.存储方法1.StringBuffer appe ...

  7. AJPFX总结在循环中break与continue的区别

    相信刚学编程的人很容易被break,continue这两个关键词搞混淆了,两者都有跳出循环的意思,但是他们到底有什么区别呢?其实很简单,break是结束整个循环体,continue是结束当前这一单次循 ...

  8. Java文件上传(基础性)

    /** * * 上传文件 * */ public class FileUploadServlet2 extends HttpServlet { protected void doGet(HttpSer ...

  9. Windows远程桌面连接复制文件失败或非常慢

    环境搭建过程中经常会遇到需要将文件从本机传到云服务器或者企业内部服务器上的场景,此时如果文件过大的话要传个半天或者直接告诉你复制失败,让人好生无奈 ~ ~.   windows环境下,可以将本地磁盘映 ...

  10. InChatter系统之服务器开发(二)

    现在我们继续进行InChatter系统的服务器端的开发,今天我们将实现服务契约同时完成宿主程序的开发,今天结束之后服务器端将可以正常运行起来. 系统的开发是随着博客一起的,颇有点现场直播的感觉,所有在 ...