BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
【题目分析】
同BZOJ2683,只需要提前处理s对结果的影响即可。
CDQ的思路还是很清晰的。
排序解决一维,
分治时间,
树状数组解决一维。
复杂度是两个log
【代码】
#include <cstdio>
#include <cstring>
#include <cstdlib>
//#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 2000005
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
struct data{
int opt,id;
int x,y,f,t;
}q[maxn],eq[maxn];
int ans[maxn],s;
int n,tot=0,cnt=0,opt,x1,y1,x2,y2,a;
struct Bit{
int a[maxn];
void init(){memset(a,0,sizeof a);}
void add(int x,int f)
{for (;x<=n;x+=x&(-x)) a[x]+=f;}
int sum(int x)
{
int ret=0;
for (;x;x-=x&(-x)) ret+=a[x];
return ret;
}
}t;
bool cmp(data a,data b)
{
if (a.x==b.x&&a.y==b.y) return a.opt<b.opt;
if (a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void solve(int l,int r)
{
if (l==r) return ;
int mid=(l+r)/2;
for (int i=l;i<=r;++i)
{
if (q[i].t<=mid&&q[i].opt==1) t.add(q[i].y,q[i].f);
if ( q[i].t>mid&&q[i].opt==2) ans[q[i].id]+=t.sum(q[i].y)*q[i].f;
}
for (int i=l;i<=r;++i)
if (q[i].t<=mid&&q[i].opt==1) t.add(q[i].y,-q[i].f);
int l1=l,l2=mid+1;
for (int i=l;i<=r;++i) {if (q[i].t<=mid) eq[l1++]=q[i]; else eq[l2++]=q[i];}
for (int i=l;i<=r;++i) q[i]=eq[i];
solve(l,mid);
solve(mid+1,r);
}
int main()
{
s=read();n=read();
while (scanf("%d",&opt)!=EOF&&opt!=3)
{
if (opt==1)
{
q[++cnt].opt=opt;
q[cnt].x=read();
q[cnt].y=read();
q[cnt].f=read();
q[cnt].t=cnt;
}
else
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2); ++tot;
ans[tot]+=(x2-x1+1)*(y2-y1+1)*s;
q[++cnt].opt=opt; q[cnt].x=x1-1; q[cnt].y=y1-1; q[cnt].f=1; q[cnt].t=cnt; q[cnt].id=tot;
q[++cnt].opt=opt; q[cnt].x=x1-1; q[cnt].y=y2; q[cnt].f=-1; q[cnt].t=cnt; q[cnt].id=tot;
q[++cnt].opt=opt; q[cnt].x=x2; q[cnt].y=y1-1; q[cnt].f=-1; q[cnt].t=cnt; q[cnt].id=tot;
q[++cnt].opt=opt; q[cnt].x=x2; q[cnt].y=y2; q[cnt].f=1; q[cnt].t=cnt; q[cnt].id=tot;
}
}
sort(q+1,q+cnt+1,cmp);
solve(1,cnt);
for (int i=1;i<=tot;++i) printf("%d\n",ans[i]);
}
BZOJ 1176 [Balkan2007]Mokia ——CDQ分治的更多相关文章
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
- BZOJ 1176: [Balkan2007]Mokia
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2012 Solved: 896[Submit][St ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- bzoj 1176 [Balkan2007]Mokia 【CDQ分治】
W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...
- BZOJ1176: [Balkan2007]Mokia CDQ分治
最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...
- BZOJ 1176: [Balkan2007]Mokia KDtree
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
随机推荐
- Excel—分离中英文字符
1.如下图: 2.提取中文字符为: 3.提取应为字符为: 4.说明: 该方法的原理利用了LENB和LEN计算方法的不同,LEN计算字符数,中英文都算作一个字符:LENB计算字节数,中文算两个字节,英文 ...
- [从产品角度学EXCEL 01]-EXCEL是怎样运作的
这是<从产品角度学EXCEL>系列第二篇. 前言请看:从产品角度学EXCEL-系列0-为什么要关注EXCEL的本质 本文不接受无授权转载,如需转载,请先联系我,非常感谢. 1.EXCEL是 ...
- SVN发布网站
1.问题 2.分析 如果机器先安装.NET framework,后安装IIS就会出现此问题,原因是.NET framework未注册. 3.注册.NET framework
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- 仅用aspx文件实现Ajax调用后台cs程序。(实例)
仅用aspx文件实现Ajax调用后台cs无刷新程序.(实例) 两个文件:aaa.aspx 和aaa.aspx.cs 一.aaa.aspx <script type="text/java ...
- SQL分页获取数据
SQL Server分页 select * from (') t Oracle分页 SELECT * FROM (' ORDER BY MaterialNM) t
- tail命令详解
搜索 纠正错误 添加实例 tail 在屏幕上显示指定文件的末尾若干行 补充说明 tail命令 用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行.如果给定的文件不止一个,则在 ...
- phpstudy 局域网访问
安装mantis缺陷管理系统,我使用的是phpstudy集成环境.之前使用wamp,同事说phpstudy好更新php版本,所有就用phpstudy了. 今天安装好phpstudy,下载mantis安 ...
- sql奇进偶舍函数
create function sslr(@num numeric(20,10),@i int) --@i保留的小数位 --@num传入的数据 returns varchar(2 ...
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...