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 ...
随机推荐
- 【WP8.1】类似“IT之家” 自定义消息 的实现
曾经在WP7.WP8下的消息 使用的都是Coding4Fun.Phone.Toolkit里面的ToastPrompt类来实现的. 现在我们来自己做个类似IT之家的这种效果:从右边弹出,经过几秒后会自动 ...
- Flask安装过程中“配置虚拟环境”步骤报错,找不到activate.bat
Run virtualenv venv --no-setuptools http://stackoverflow.com/questions/21826859/setting-up-a-virtual ...
- java常用工具
/** * 将字节数组转换成字符串 * @param array 字节数组 * @return String */ public static String byte2str(byte[] array ...
- ip地址转换
通常,我们用点分十进制字符串表示ipv4地址(192.168.1.1),用十六进制字符串表示ipv6地址(fe80::20c:29ff:fee9:4bcc). ipv4转换函数 #include &l ...
- Web干货存档
今天看了某乎,介绍了web一些基本东西,讲的很好,随手留下https://www.zhihu.com/question/22689579 web开发者文档,纯干货 https://develope ...
- powershell通过wps excel导出csv
powershell比较强大,比较好用,比较方便. $et=New-Object -ComObject et.application #$et.Visible=$true $et.DisplayAle ...
- MyBatis:统计数量
dao: /** * 统计商家的案例数量 * * @param shopId * @return */ long countByShopId(Long shopId); @Override publi ...
- 442. Find All Duplicates in an Array
https://leetcode.com/problems/find-all-duplicates-in-an-array/ 一列数,1 ≤ a[i] ≤ n (n = size of array), ...
- oracleDBA-D1
一.数据库备份 1.测试系统环境:win10 64位 企业版 测试数据库环境:oracle11gR2 2.步骤: I.首先以sysdba权限用户登录数据库,命令: SQL> connect 超 ...
- jquery追加内容
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...