题目:洛谷P4390、BZOJ1176。

题目大意:

给你一个\(W\times W\)的矩阵,初始每个数都为\(S\)。现在有若干操作:

1. 给某个格子加上一个值;
2. 询问某个子矩阵的值的和;
3. 结束询问

解题思路:

CDQ分治。

离线操作,把询问拆成4个矩阵(二维前缀和)。

对\(x\)轴排序,分治询问,用左区间的修改来更新右区间的询问。由于\(x\)已被排序,我们直接用树状数组维护\(y\)的前缀和即可。

也可以边CDQ边归并排序。

时间复杂度\(O(n\log^2 n)\)。

C++ Code:

#include<cstdio>
#include<algorithm>
#include<cctype>
#define LoveLive long long
#define M 2000005
int S,W,cnt=0;
LoveLive bit[M];
inline int readint(){
int c=getchar(),d=0,f=0;
for(;!isdigit(c);c=getchar())f=c=='-';
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return f?-d:d;
}
struct Qs{
int type,x,y,id;LoveLive num;//type 0: modify; type 1: query.
inline bool operator<(const Qs&rhs)const{return id<rhs.id;}
}q[200020],t[200020];
inline void add(int x,LoveLive y){for(int i=x;i<M;i+=i&-i)bit[i]+=y;}
inline LoveLive ask(int x){LoveLive ans=0;for(int i=x;i;i-=i&-i)ans+=bit[i];return ans;}
inline void clear(int x){for(int i=x;i<M;i+=i&-i)bit[i]=0;}
void cdq(int l,int r){
if(l<r){
int mid=l+r>>1;
cdq(l,mid),cdq(mid+1,r);
int a=l,b=mid+1,c=l;
while(a<=mid&&b<=r){
if(q[a].x<=q[b].x){
if(!q[a].type)add(q[a].y,q[a].num);
t[c++]=q[a++];
}else{
if(q[b].type)q[b].num+=ask(q[b].y);
t[c++]=q[b++];
}
}
while(a<=mid){
if(!q[a].type)add(q[a].y,q[a].num);
t[c++]=q[a++];
}
while(b<=r){
if(q[b].type)q[b].num+=ask(q[b].y);
t[c++]=q[b++];
}
for(int i=l;i<=mid;++i)if(!q[i].type)clear(q[i].y);
for(int i=l;i<=r;++i)q[i]=t[i];
}
}
int main(){
S=readint(),W=readint();
for(int opt=readint();opt^3;opt=readint()){
if(opt==1){
int x=readint(),y=readint(),p=readint();
++cnt;
q[cnt]=(Qs){0,x,y,cnt,p};
}else{
int x1=readint(),y1=readint(),x2=readint(),y2=readint();
++cnt;q[cnt]=(Qs){1,x1-1,y1-1,cnt,0};
++cnt;q[cnt]=(Qs){1,x1-1,y2,cnt,0};
++cnt;q[cnt]=(Qs){1,x2,y1-1,cnt,0};
++cnt;q[cnt]=(Qs){1,x2,y2,cnt,0};
}
}
cdq(1,cnt);
std::sort(q+1,q+cnt+1);
for(int i=1;i<=cnt;++i)
if(q[i].type){
printf("%d\n",int(q[i+3].num-q[i+2].num-q[i+1].num+q[i].num+1ll*S*(q[i+3].y-q[i].y)*(q[i+3].x-q[i].x)));i+=3;
}
return 0;
}

[BOI2007]摩基亚的更多相关文章

  1. COGS1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★☆   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  2. COJS 1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★★   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  3. COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)

    题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...

  4. 分治(CDQ):[BOI2007]摩基亚Mokia

    [题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...

  5. COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...

  6. Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia

    题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...

  7. 【COGS1752】 BOI2007—摩基亚Mokia

    http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...

  8. COGS1752. [BOI2007]摩基亚Mokia CDQ

    CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  9. [COGS 1752] 摩基亚Mokia

    照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in   输出文件:mokia.out 时间限制:1.5 s   内存限制:128 MB [题目描述] 摩尔瓦多的移 ...

随机推荐

  1. CSS - Span 下的width设置不可用?

    解决:Span 下的width设置不可用? 内联元素-span有根据内容自动伸缩的能力,当需要对其宽度设定时,出现无效的情况. Demo:http://jsfiddle.net/JSDavi/ad62 ...

  2. POJ3984-迷宫问题【BFS】

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  3. [bzoj2662 BeiJing wc2012] 冻结 (分层图+最短路)

    传送门 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„&q ...

  4. 记录python爬取猫眼票房排行榜(带stonefont字体网页),保存到text文件,csv文件和MongoDB数据库中

    猫眼票房排行榜页面显示如下: 注意右边的票房数据显示,爬下来的数据是这样显示的: 网页源代码中是这样显示的: 这是因为网页中使用了某种字体的缘故,分析源代码可知: 亲测可行: 代码中获取的是国内票房榜 ...

  5. 微信公众号开发之获取微信用户的openID

    (注:openID同一用户同一应用唯一,UnionID同一用户不同应用唯一.不同应用指微信开放平台下的不同用户.) 1.  申请测试号(获得appID.appsecret) 2.  填写服务器配置并验 ...

  6. 关于安卓sdk开发环境的的更新-Android SDK下载和更新失败

    由于特别原因,我们更新安卓sdk时不会成功.解决办法: 修改C:\Windows\System32\drivers\etc\hosts文件.添加一行:74.125.237.1       dl-ssl ...

  7. IDEA解决中文乱码问题

    idea在使用过程中经常会遇到各种乱码问题,网上也有很多解决办法,今天所讲的就是终极解决办法: (1)首先,全局搜索文件 idea64.exe.vmoptions 找到之后,将该行代码复制进去即可   ...

  8. 【ACM-ICPC 2018 南京赛区网络预赛 A】An Olympian Math Problem

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 估计试几个就会发现答案总是n-1吧. 队友给的证明 [代码] #include <bits/stdc++.h> #def ...

  9. 【hiho一下 第八周】状态压缩·一

    [题目链接]:http://hihocoder.com/problemset/problem/1044 [题意] [题解] 设f[i][j]表示; 前i-1个位置已经决策完; 然后i-m+1..i这一 ...

  10. python2.7编码与解码

    常见的编码 ASCII: 美国人发明的,只编码英文字母和符号,1个字节. GB2312: 中国人发明的,增加了中文汉字和符号,2个字节. Unicode: 为了把所有语言都统一到一套编码里,一般是2个 ...