洛谷P4390 Mokia CDQ分治
喜闻乐见的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分治的更多相关文章
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- [洛谷P4390][BOI2007]Mokia 摩基亚
题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ...
- [洛谷P3806] [模板] 点分治1
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
- [bzoj1176]Mokia[CDQ分治]
啃了一天论文,发现CDQ分治的原理其实很简单,大概就是这样的一类分治:将左右区间按一定规律排序后分开处理,递归到底时直接计算答案,对于一个区间,按照第二关键字split成两个区间,先处理左区间,之后因 ...
- 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告
P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...
随机推荐
- PDO连接mysql数据库加载慢
今天在使用PDO连接mysql操作数据库的时候,发现速度特别慢,都1~2s的时间,不知道怎么回事,后来一步一步排除到new PDO 导致过慢的原因, 这个尴尬了...,调试了半天都没想到问下度娘,才知 ...
- Window下通过SecureCRT的SSH2跳转到另一台Linux服务器
我工作中的示例: 先登录192.168.2.145 Your password will be expired in 200 days.Welcome to Baoleiji System.Last ...
- 如何建立一个WCF服务并将其发布到IIS上
在我们的软件开发中,经常会连接到数据库中,如果是常规的操作,我们经常会将连接数据库的字符串写在配置文件中,然后去读取数据库的连接字符串,其实这种方式是非常不科学的,这会直接暴露我们的数据库,直接暴露我 ...
- SSM+shiro及相关插件的整合maven所有依赖,详细注释版,自用,持续更新
整合了SSM+shiro框架,slf4j+logback日志,及一些好用的插件PageHelper,mybatis-generator,Lombok,fastjson等等 <?xml versi ...
- word2vec训练&IC分词(待)
参考http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96 ...
- LODOP直接用base64码输出图片
Lodop中的ADD_PRINT_IMAGE,也可以直接输出base64码图片,不用加img标签,如果加了img标签,会被当做超文本对待,受浏览器引擎解析的影响. 什么时候使用base64码直接输出比 ...
- Python学习之路——Day02
今日内容: 1.编程语言介绍(***) 2.python介绍(***) 3.安装cpython解释器(多个版本)(****) 4.运行python程序的两种方式(****) 4.1 交互式 4.2 命 ...
- Linux命令替换字符串
:%s/str1/str2/ 用str2替换str1
- 在 ubuntu 中安装 python3.5、 tornado、 pymysql
一.在 ubuntu 中安装 python3.5 1.首先,在系统中是自带python2.7的.不要卸载,因为一些系统的东西是需要这个的.python2.7和python3.5是可以共存的. 命令如下 ...
- Spring 使用介绍(十)—— 单元测试
一.概述 Spring测试框架提供了对单元测试的支持,以便使用spring的依赖注入和事务管理功能 maven依赖: <dependency> <groupId>junit&l ...