【BZOJ1176】[Balkan2007]Mokia

Description

维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

Input

第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小
接下来每行为一下三种输入之一(不包含引号):
"1 x y a"
"2 x1 y1 x2 y2"
"3"
输入1:你需要把(x,y)(第x行第y列)的格子权值增加a

输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,并输出

输入3:表示输入结束

Output

对于每个输入2,输出一行,即输入2的答案

Sample Input

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5

HINT

保证答案不会超过int范围

【BZOJ2683】简单题

题意:和上面一样

题解:依旧是分治思路

我们将询问差分,拆成四个点分别求前缀和,然后将询问和修改一起按横坐标排序;

然后在跑cdq分治的时候,我们一边递归一边按照修改的时间进行归并排序。根据cdq分治的思想,我们在执行区间[l,r]时已经处理完[l,mid]和[mid+1,r]了,那么我们只需要处理[l,mid]中的修改对[mid+1,r]中的询问造成的影响。于是我们在跑归并排序的时候,将[l,mid]中的修改按照纵坐标插入树状数组,然后将[mid+1,r]中的询问按照纵坐标在树状数组上查找,再更新一下答案就好了

这代码我已经不怎么压行了,是不是可读性高了好多。。。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. int n,num,m;
  7. const int maxn=200010;
  8. struct node
  9. {
  10. int x,y,org,v,k;
  11. }s[maxn];
  12. int p[maxn],q[maxn],tr[maxn*10],ans[maxn];
  13. //p是归并排序的顺序,q是p的复制
  14. bool cmp(node a,node b)
  15. {
  16. if(a.x==b.x&&a.org==b.org) return a.y<b.y;
  17. if(a.x==b.x) return a.org<b.org;
  18. return a.x<b.x;
  19. }
  20. void updata(int a,int val)
  21. {
  22. for(int i=a;i<=n;i+=i&-i) tr[i]+=val;
  23. }
  24. int query(int a)
  25. {
  26. int i,ret=0;
  27. for(i=a;i;i-=i&-i) ret+=tr[i];
  28. return ret;
  29. }
  30. void dfs(int l,int r)
  31. {
  32. if(l==r)
  33. {
  34. p[l]=l;
  35. return ;
  36. }
  37. int i,mid=l+r>>1,h1=l,h2=mid+1;
  38. dfs(l,mid),dfs(mid+1,r);
  39. for(i=l;i<=r;i++)
  40. {
  41. if(h2<=r&&(h1>mid||s[p[h1]].org>=s[p[h2]].org))
  42. {
  43. if(!s[p[h2]].k) ans[s[p[h2]].org]+=s[p[h2]].v*query(s[p[h2]].y);
  44. q[i]=p[h2++];
  45. }
  46. else
  47. {
  48. if(s[p[h1]].k) updata(s[p[h1]].y,s[p[h1]].v);
  49. q[i]=p[h1++];
  50. }
  51. }
  52. for(i=l;i<=mid;i++) if(s[p[i]].k) updata(s[p[i]].y,-s[p[i]].v);
  53. for(i=l;i<=r;i++) p[i]=q[i];
  54. }
  55. int main()
  56. {
  57. int i,a,b,c,d,e;
  58. scanf("%d%d",&a,&n);
  59. for(i=1;e!=3;i++)
  60. {
  61. scanf("%d",&e);
  62. if(e==1)
  63. {
  64. scanf("%d%d%d",&a,&b,&c);
  65. s[++num].x=a,s[num].y=b,s[num].org=m,s[num].k=1,s[num].v=c;
  66. }
  67. if(e==2)
  68. {
  69. scanf("%d%d%d%d",&a,&b,&c,&d),a--,b--;
  70. s[num+1].org=s[num+2].org=s[num+3].org=s[num+4].org=++m;
  71. s[num+1].k=s[num+2].k=s[num+3].k=s[num+4].k=0;
  72. s[++num].x=a,s[num].y=b,s[num].v=1;
  73. s[++num].x=a,s[num].y=d,s[num].v=-1;
  74. s[++num].x=c,s[num].y=b,s[num].v=-1;
  75. s[++num].x=c,s[num].y=d,s[num].v=1;
  76. }
  77. }
  78. sort(s+1,s+num+1,cmp);
  79. dfs(1,num);
  80. for(i=1;i<=m;i++) printf("%d\n",ans[i]);
  81. return 0;
  82. }

【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治的更多相关文章

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

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

  2. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...

  3. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  4. Bzoj2683 简单题 [CDQ分治]

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  5. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

  6. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

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

  7. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  8. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  9. BZOJ 2683: 简单题(CDQ 分治)

    题面 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...

随机推荐

  1. lvm 新建一个vg 逻辑卷 配置启动

    fdisk /dev/sdb 格式 t  8e w vgcreate datavg /dev/sdb1lvcreate -L 999G -n lvdata datavgmkfs.xfs /dev/da ...

  2. jquery easyui datagrid 分页实现

    通常情况下页面数据的分页显示分成真假两种.真分页是依靠后台查询时控制调出数据的数量来实现分页,也就是说页面在后台对数据进行处理,仅传输当前需要页的数据到前台来显示.而假分页则是后台一次性将所有的数据一 ...

  3. 关于datatable导出execl

    导出主要考虑响应流的问题 curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Resp ...

  4. ggplot2——简介

    ggplot2是R语言最为强大的作图软件包,强于其自成一派的数据可视化理念.当熟悉了ggplot2的基本套路后,数据可视化工作将变得非常轻松而有条理. 本文主要对ggplot2的可视化理念及开发套路做 ...

  5. appium的inspectot使用

    前提已安装好appium环境 1. 打开appium-doctor 2. 启动appium-service,点击  inspector 3. 配置手机参数,参数获取参考上篇博客 4. 点击start ...

  6. Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式

    首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...

  7. java中Scanner的nextLine()和next()的区别

    首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后 ...

  8. linux -- Ubuntu 安装搜狗输入法

    在Ubuntu Kylin系统中,默认安装搜狗拼音输入法,但是在原生Ubuntu系统中则不是.这可以理解,毕竟搜狗输入法的Linux版有Kylin团队的不小功劳.由于搜狗输入法确实比Linux系统下其 ...

  9. samtools faidx 命令处理fasta序列

    samtools faidx 能够对fasta 序列建立一个后缀为.fai 的文件,根据这个.fai 文件和原始的fastsa文件, 能够快速的提取任意区域的序列 用法: samtools faidx ...

  10. 访问GitLab的PostgreSQL数据库

    1.登陆gitlab的安装服务查看配置文件 cat /var/opt/gitlab/gitlab-rails/etc/database.yml production: adapter: postgre ...