【题目分析】

同BZOJ2683,只需要提前处理s对结果的影响即可。

CDQ的思路还是很清晰的。

排序解决一维,

分治时间,

树状数组解决一维。

复杂度是两个log

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. //#include <cmath>
  5.  
  6. #include <set>
  7. #include <map>
  8. #include <string>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <iostream>
  12. #include <queue>
  13. using namespace std;
  14.  
  15. #define maxn 2000005
  16.  
  17. int read()
  18. {
  19. int x=0,f=1; char ch=getchar();
  20. while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  21. while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
  22. return x*f;
  23. }
  24.  
  25. struct data{
  26. int opt,id;
  27. int x,y,f,t;
  28. }q[maxn],eq[maxn];
  29.  
  30. int ans[maxn],s;
  31. int n,tot=0,cnt=0,opt,x1,y1,x2,y2,a;
  32.  
  33. struct Bit{
  34. int a[maxn];
  35. void init(){memset(a,0,sizeof a);}
  36. void add(int x,int f)
  37. {for (;x<=n;x+=x&(-x)) a[x]+=f;}
  38. int sum(int x)
  39. {
  40. int ret=0;
  41. for (;x;x-=x&(-x)) ret+=a[x];
  42. return ret;
  43. }
  44. }t;
  45.  
  46. bool cmp(data a,data b)
  47. {
  48. if (a.x==b.x&&a.y==b.y) return a.opt<b.opt;
  49. if (a.x==b.x) return a.y<b.y;
  50. return a.x<b.x;
  51. }
  52.  
  53. void solve(int l,int r)
  54. {
  55. if (l==r) return ;
  56. int mid=(l+r)/2;
  57. for (int i=l;i<=r;++i)
  58. {
  59. if (q[i].t<=mid&&q[i].opt==1) t.add(q[i].y,q[i].f);
  60. if ( q[i].t>mid&&q[i].opt==2) ans[q[i].id]+=t.sum(q[i].y)*q[i].f;
  61. }
  62. for (int i=l;i<=r;++i)
  63. if (q[i].t<=mid&&q[i].opt==1) t.add(q[i].y,-q[i].f);
  64. int l1=l,l2=mid+1;
  65. for (int i=l;i<=r;++i) {if (q[i].t<=mid) eq[l1++]=q[i]; else eq[l2++]=q[i];}
  66. for (int i=l;i<=r;++i) q[i]=eq[i];
  67. solve(l,mid);
  68. solve(mid+1,r);
  69. }
  70.  
  71. int main()
  72. {
  73. s=read();n=read();
  74. while (scanf("%d",&opt)!=EOF&&opt!=3)
  75. {
  76. if (opt==1)
  77. {
  78. q[++cnt].opt=opt;
  79. q[cnt].x=read();
  80. q[cnt].y=read();
  81. q[cnt].f=read();
  82. q[cnt].t=cnt;
  83. }
  84. else
  85. {
  86. scanf("%d%d%d%d",&x1,&y1,&x2,&y2); ++tot;
  87. ans[tot]+=(x2-x1+1)*(y2-y1+1)*s;
  88. 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;
  89. 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;
  90. 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;
  91. q[++cnt].opt=opt; q[cnt].x=x2; q[cnt].y=y2; q[cnt].f=1; q[cnt].t=cnt; q[cnt].id=tot;
  92. }
  93. }
  94. sort(q+1,q+cnt+1,cmp);
  95. solve(1,cnt);
  96. for (int i=1;i<=tot;++i) printf("%d\n",ans[i]);
  97. }

  

BZOJ 1176 [Balkan2007]Mokia ——CDQ分治的更多相关文章

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

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

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

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

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

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

  4. BZOJ 1176: [Balkan2007]Mokia

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

  5. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  6. bzoj 1176 [Balkan2007]Mokia 【CDQ分治】

    W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...

  7. BZOJ1176: [Balkan2007]Mokia CDQ分治

    最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...

  8. BZOJ 1176: [Balkan2007]Mokia KDtree

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...

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

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

随机推荐

  1. 【WP8.1】类似“IT之家” 自定义消息 的实现

    曾经在WP7.WP8下的消息 使用的都是Coding4Fun.Phone.Toolkit里面的ToastPrompt类来实现的. 现在我们来自己做个类似IT之家的这种效果:从右边弹出,经过几秒后会自动 ...

  2. Flask安装过程中“配置虚拟环境”步骤报错,找不到activate.bat

    Run virtualenv venv --no-setuptools http://stackoverflow.com/questions/21826859/setting-up-a-virtual ...

  3. java常用工具

    /** * 将字节数组转换成字符串 * @param array 字节数组 * @return String */ public static String byte2str(byte[] array ...

  4. ip地址转换

    通常,我们用点分十进制字符串表示ipv4地址(192.168.1.1),用十六进制字符串表示ipv6地址(fe80::20c:29ff:fee9:4bcc). ipv4转换函数 #include &l ...

  5. Web干货存档

    今天看了某乎,介绍了web一些基本东西,讲的很好,随手留下https://www.zhihu.com/question/22689579 web开发者文档,纯干货   https://develope ...

  6. powershell通过wps excel导出csv

    powershell比较强大,比较好用,比较方便. $et=New-Object -ComObject et.application #$et.Visible=$true $et.DisplayAle ...

  7. MyBatis:统计数量

    dao: /** * 统计商家的案例数量 * * @param shopId * @return */ long countByShopId(Long shopId); @Override publi ...

  8. 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), ...

  9. oracleDBA-D1

    一.数据库备份 1.测试系统环境:win10 64位 企业版 测试数据库环境:oracle11gR2 2.步骤: I.首先以sysdba权限用户登录数据库,命令: SQL> connect  超 ...

  10. jquery追加内容

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...