【BZOJ1176】[Balkan2007]Mokia

Description

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

Input

第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小
接下来每行为一下三种输入之一(不包含引号):
"1 x y a"
"2 x1 y1 x2 y2"
"3"
输入1:你需要把(x,y)(第x行第y列)的格子权值增加a

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

输入3:表示输入结束

Output

对于每个输入2,输出一行,即输入2的答案

Sample Input

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5

HINT

保证答案不会超过int范围

【BZOJ2683】简单题

题意:和上面一样

题解:依旧是分治思路

我们将询问差分,拆成四个点分别求前缀和,然后将询问和修改一起按横坐标排序;

然后在跑cdq分治的时候,我们一边递归一边按照修改的时间进行归并排序。根据cdq分治的思想,我们在执行区间[l,r]时已经处理完[l,mid]和[mid+1,r]了,那么我们只需要处理[l,mid]中的修改对[mid+1,r]中的询问造成的影响。于是我们在跑归并排序的时候,将[l,mid]中的修改按照纵坐标插入树状数组,然后将[mid+1,r]中的询问按照纵坐标在树状数组上查找,再更新一下答案就好了

这代码我已经不怎么压行了,是不是可读性高了好多。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,num,m;
const int maxn=200010;
struct node
{
int x,y,org,v,k;
}s[maxn];
int p[maxn],q[maxn],tr[maxn*10],ans[maxn];
//p是归并排序的顺序,q是p的复制
bool cmp(node a,node b)
{
if(a.x==b.x&&a.org==b.org) return a.y<b.y;
if(a.x==b.x) return a.org<b.org;
return a.x<b.x;
}
void updata(int a,int val)
{
for(int i=a;i<=n;i+=i&-i) tr[i]+=val;
}
int query(int a)
{
int i,ret=0;
for(i=a;i;i-=i&-i) ret+=tr[i];
return ret;
}
void dfs(int l,int r)
{
if(l==r)
{
p[l]=l;
return ;
}
int i,mid=l+r>>1,h1=l,h2=mid+1;
dfs(l,mid),dfs(mid+1,r);
for(i=l;i<=r;i++)
{
if(h2<=r&&(h1>mid||s[p[h1]].org>=s[p[h2]].org))
{
if(!s[p[h2]].k) ans[s[p[h2]].org]+=s[p[h2]].v*query(s[p[h2]].y);
q[i]=p[h2++];
}
else
{
if(s[p[h1]].k) updata(s[p[h1]].y,s[p[h1]].v);
q[i]=p[h1++];
}
}
for(i=l;i<=mid;i++) if(s[p[i]].k) updata(s[p[i]].y,-s[p[i]].v);
for(i=l;i<=r;i++) p[i]=q[i];
}
int main()
{
int i,a,b,c,d,e;
scanf("%d%d",&a,&n);
for(i=1;e!=3;i++)
{
scanf("%d",&e);
if(e==1)
{
scanf("%d%d%d",&a,&b,&c);
s[++num].x=a,s[num].y=b,s[num].org=m,s[num].k=1,s[num].v=c;
}
if(e==2)
{
scanf("%d%d%d%d",&a,&b,&c,&d),a--,b--;
s[num+1].org=s[num+2].org=s[num+3].org=s[num+4].org=++m;
s[num+1].k=s[num+2].k=s[num+3].k=s[num+4].k=0;
s[++num].x=a,s[num].y=b,s[num].v=1;
s[++num].x=a,s[num].y=d,s[num].v=-1;
s[++num].x=c,s[num].y=b,s[num].v=-1;
s[++num].x=c,s[num].y=d,s[num].v=1;
}
}
sort(s+1,s+num+1,cmp);
dfs(1,num);
for(i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治的更多相关文章

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

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

  2. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...

  3. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  4. Bzoj2683 简单题 [CDQ分治]

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  5. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

  6. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

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

  7. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  8. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  9. BZOJ 2683: 简单题(CDQ 分治)

    题面 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...

随机推荐

  1. 简单十招提高jQuery执行效率

    1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...

  2. C# 属性事件一些设置说明

    大致列举一些常用的属性或事件的一些修饰 用法类似,主要是对属性的进一步设置 [Browsable(true)] public bool Enable {get;set;} 顺便说一下事件的应用: pu ...

  3. Json.net 时间格式处理

    json.net转json时生成的时间格式是这种 2015-11-14T06:59:59+08:00 格式化为这种2015-11-14 后台代码: IsoDateTimeConverter timeF ...

  4. PHP清除HTML代码、空格、回车换行符的函数

    清除HTML代码.空格.回车换行符的函数如下 function DeleteHtml($str) { $str = trim($str); $str = strip_tags($str,"& ...

  5. jQuery-替换和删除元素

    1.replaceWith方法 用提供的内容替换集合中所有匹配的元素并且返回被替换元素的集合 参数类型说明: 1)普通字符串(可包含各种html标签) 2)jQuery对象 ①使用$函数创建的新元素( ...

  6. SharePoint 2010 自定义页面出现“项目可能已被其他用户删除或重命名”问题跟踪

    异常详细信息: Microsoft.SharePoint.SPException: 位置 http://portal/Pages/ShowArticle.aspx?id=19&mylist=8 ...

  7. C++类中静态成员函数

    引述自<深入探索C++对象模型>2001:5:1版次,p-150 static member functions的主要特性就是它没有this指针,所以: 1.它不能直接存取其所在class ...

  8. 左侧固定宽度,右侧自适应宽度的CSS布局

    BI上有高手专门讨论了这种布局方法,但他用了较多的hack,还回避了IE6的dtd.我在实际使用中,发现回避掉IE6的dtd定义后,会导致ajax模态框无法居中(VS的一个控件,自动生成的代码,很难修 ...

  9. 继承MonoBehaviour类的优缺点和相关报错

    Unity3D文档里虽然说所有脚本继承MonoBehaviour类,但如果你想自定义类,就可以不用继承MonoBehaviour,但是这个类只能调用其中的方法和属性,无法拖到场景的物体中使用. 所有从 ...

  10. linux,crontab定时任务中为脚本指定使用参数,crontab的脚本中是否可以带参数

    需求描述: 今天在写脚本的时候,脚本的运行需要给出几个参数,那么就考虑 在crontab写定时任务的时候,是否也是能够在脚本中,增加参数呢, 因为以前没有这么用过,所以呢,就进行一次测试. 测试过程: ...