喜闻乐见的CDQ分治被我搞的又WA又T.....

大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问。然后施CDQ大法即可。

我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就行了?在统计的时候统计一个差值即可。

然后一交,自信40...

那么果然还是拆成4个吧...T了,60分。

然后放弃那个朴素的sort版CDQ,采用了归并,就A了。

 #include <cstdio>
#include <algorithm>
using namespace std;
const int N = ,M = ;
inline int read()
{
int ans=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return ans;
}
struct Node
{
int x,y,k,type,t;
}node[N],temp[N];int tot;
int ask[],cnt,n;
inline bool cmp_x(Node a,Node b)
{
if(a.x!=b.x)return a.x<b.x;
return a.type<b.type;
}
inline bool cmp_t(Node a,Node b)
{
if(a.t!=b.t)return a.t<b.t;
return a.type<b.type;
}
int ta[M];
inline int lowbit(int i) {return i&(-i);}
inline void add(int x,int a)
{
if(x<=) return;
for(int i=x;i<=n;i+=lowbit(i)) ta[i]+=a;
return;
}
inline int getsum(int x)
{
if(x<=) return ; int ans=;
for(int i=x;i>;i-=lowbit(i)) ans+=ta[i];
return ans;
}
void CDQ(int l,int r)
{
if(l==r)return;
int mid=(l+r)>>;
CDQ(l,mid);CDQ(mid+,r); int i=l,j=mid+,t=;
while(j<=r||i<=mid)
{
if(j>r||(i<=mid&&node[i].x<=node[j].x))
{
if(node[i].type==) add(node[i].y,node[i].k);
temp[++t]=node[i++];
}
else
{
if(node[j].type>) node[j].k+=getsum(node[j].y);
temp[++t]=node[j++];
}
}
for(j=l;j<i;j++)
{
if(node[j].type==)add(node[j].y,-node[j].k);
}
t=;
for(i=l;i<=r;i++) node[i]=temp[++t];
return;
}
int main()
{
n=read();n=read();
int flag,x,y,xx,yy,k,time=;
flag=read();
while(flag!=)
{
time++;
if(flag==)
{
x=read();y=read();k=read();
node[++tot].x=x;
node[tot].y=y;
node[tot].k=k;
node[tot].t=time;
node[tot].type=;
}
else
{
x=read();y=read();xx=read();yy=read();
x--;y--;
node[++tot].x=xx;
node[tot].y=yy;
node[tot].t=time;
node[tot].type=;
ask[++cnt]=tot;
node[++tot].x=x;
node[tot].y=y;
node[tot].t=time;
node[tot].type=;
node[++tot].x=x;
node[tot].y=yy;
node[tot].t=time;
node[tot].type=;
node[++tot].x=xx;
node[tot].y=y;
node[tot].t=time;
node[tot].type=;
}
flag=read();
}
CDQ(,tot);
sort(node+,node+tot+,cmp_t);
for(int i=;i<=cnt;i++)
{
int p=ask[i];
int ans=node[p].k+node[p+].k-node[p+].k-node[p+].k;
printf("%d\n",ans);
}
return ;
}

AC代码:

洛谷P4390 Mokia CDQ分治的更多相关文章

  1. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

  2. [洛谷P4390][BOI2007]Mokia 摩基亚

    题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...

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

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

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

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

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

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

  6. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

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

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

  8. [bzoj1176]Mokia[CDQ分治]

    啃了一天论文,发现CDQ分治的原理其实很简单,大概就是这样的一类分治:将左右区间按一定规律排序后分开处理,递归到底时直接计算答案,对于一个区间,按照第二关键字split成两个区间,先处理左区间,之后因 ...

  9. 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告

    P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...

随机推荐

  1. 解决ssh ltt3.bg.cn 'jps' bash: jps: command not found 问题

    >>提君博客原创  http://www.cnblogs.com/tijun/  << linux 上我用hadoop用户配置好SSH后,运行 ssh ltt3.bg.cn ' ...

  2. java日志框架之logback(一)——logback工程简介

    Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...

  3. hadoop第一个例子

    Java.io.URL 1.编写java程序 package com.company; import java.io.IOException; import java.io.InputStream; ...

  4. jQ append 添加html 及字符串拼接

    如图,我要拼接这样一段html: 点击下边添加按钮,不断添加这段Html html: <div class="x_addtable"> <div class=&q ...

  5. MyBatis基础:MyBatis入门(1)

    1. MyBatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis ...

  6. 莫烦sklearn学习自修第八天【过拟合问题】

    1. 什么是过拟合问题 所谓过拟合问题指的是使用训练样本进行训练时100%正确分类或规划,当使用测试样本时则不能正确分类和规划 2. 代码实战(模拟过拟合问题) from __future__ imp ...

  7. SWT 几个sample网站

    https://www.programcreek.com/java-api-examples/org.eclipse.swt.custom.ScrolledComposite https://o7pl ...

  8. Python——管道通信

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Pipe,Process def func(conn1,conn2): conn2.close() whi ...

  9. MySQL 5.7 关闭严格模式

    If your app was written for older versions of MySQL and is not compatible with strict SQL mode in My ...

  10. linux Vi使用

    前言    在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式vi编辑器有3种模式:命令模式.输入模式.末行模式. ...