原题

给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为:

输入1:你需要把(x,y)(第x行第y列)的格子权值增加a

输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,并输出

输入3:表示输入结束


因为修改之间相互独立,所以可以用CDQ。

三个维度分别为时间,x轴,y轴。

简单的三维偏序即可。

#include<cstdio>
#include<algorithm>
#define N 200010
using namespace std;
struct hhh
{
int x,y,w,pos,id,op;
bool operator < (const hhh &b) const
{
if (x==b.x && y==b.y) return op<b.op;
if (x==b.x) return y<b.y;
return x<b.x;
}
}q[N],tmp[N];
int s,w,n,ans[N],m,op,f[10*N]; int read()
{
int ans=0,fu=1;
char j=getchar();
for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
} void addquery()
{
int lx=read(),ly=read(),rx=read(),ry=read();
int pos=++ans[0];
q[++m].pos=pos;q[m].id=m;q[m].x=lx-1;q[m].y=ly-1;q[m].w=1;q[m].op=1;
q[++m].pos=pos;q[m].id=m;q[m].x=rx;q[m].y=ry;q[m].w=1;q[m].op=1;
q[++m].pos=pos;q[m].id=m;q[m].x=lx-1;q[m].y=ry;q[m].w=-1;q[m].op=1;
q[++m].pos=pos;q[m].id=m;q[m].x=rx;q[m].y=ly-1;q[m].w=-1;q[m].op=1;
} void add(int x,int y)
{
while (x<=w)
{
f[x]+=y;
x+=x&-x;
}
} int query(int x)
{
int ans=0;
while (x)
{
ans+=f[x];
x-=x&-x;
}
return ans;
} void CDQ(int l,int r)
{
if (l==r) return ;
int mid=(l+r)>>1,i=l,j=mid+1;
for (int k=l;k<=r;k++)
{
if (q[k].id<=mid && !q[k].op)
add(q[k].y,q[k].w);
if (q[k].id>mid && q[k].op)
ans[q[k].pos]+=q[k].w*query(q[k].y);
}
for (int k=l;k<=r;k++)//清空树状数组
if (q[k].id<=mid && !q[k].op) add(q[k].y,-q[k].w);
for (int k=l;k<=r;k++)
if (q[k].id<=mid) tmp[i++]=q[k];
else tmp[j++]=q[k];
for (int k=l;k<=r;k++)
q[k]=tmp[k];
CDQ(l,mid);
CDQ(mid+1,r);
} int main()
{
s=read();
w=read();
while (1)
{
op=read();
if (op==1)
{
q[++m].x=read();
q[m].y=read();
q[m].w=read();
q[m].id=m;
}
else if (op==2)
addquery();
else break;
}
sort(q+1,q+m+1);
CDQ(1,m);
for (int i=1;i<=ans[0];i++)
printf("%d\n",ans[i]);
return 0;
}

[bzoj] 1176 Mokia || CDQ分治的更多相关文章

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

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

  2. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

  3. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

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

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

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

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

  6. bzoj 1176 Mokia(CDQ分治,BIT)

    [题目链接]  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=96974 [题意] 定义查询操作与修改操作:1 x y z 为 ...

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

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

  8. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

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

  9. bzoj 4237 稻草人 - CDQ分治 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...

随机推荐

  1. layer 的功能

    1.layer.alert() layer.alert('',{ title: "<div style='color:red;margin-left:20px;font-size:20 ...

  2. scrapy--cnblogs

    之前一直在学习关于滑块验证码的爬虫知识,最接近的当属于模拟人的行为进行鼠标移动,登录页面之后在获取了,由于一直找不到滑块验证码的原图,无法通过openCV获取当前滑块所需要移动的距离. 1.机智如我开 ...

  3. dts--tests(四)

    unit_tests.py """ DPDK Test suite. This TestSuite runs the unit tests included in DPD ...

  4. MOS管学习笔记

    最近在做一个小的电路设计项目,其中遇到了MOS管,经过查询资料,多年遗忘的数电.模电渐渐又浮现在我的脑海,在百度文库找到一篇比较不错的文章,把它截图使用出来,如原稿作者看到感觉侵权,请及时联系我,以便 ...

  5. Mysql 索引 简介

    Mysql索引 索引的分类 索引的创建 索引的注意事项 什么是索引 索引是存储引擎用于快速查找记录的一种数据结构. 索引由数据库中一列或者多列组成,作用是提高表的查询速度. 索引的优点,提高检索数据的 ...

  6. B1018 锤子剪刀布 (20分)

    B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...

  7. Pandas 文本数据

    Pandas针对字符串配备的一套方法,使其易于对数组的每个元素(字符串)进行操作. 1.通过str访问,且自动排除丢失/ NA值 # 通过str访问,且自动排除丢失/ NA值 s = pd.Serie ...

  8. [BZOJ3631][JLOI2014]松鼠的新家(树链剖分)

    [BZOJ3631] 树剖模板题了, Code #include <cstdio> #include <algorithm> #define MID int mid=(l+r) ...

  9. python基础之装饰器扩展和迭代器

    wraps模块 让原函数保留原来的说明信息 import time import random from functools import wraps def auth(func): '''auth ...

  10. 十三、MySQL之IDE工具介绍及数据备份

    一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...