http://www.lydsy.com/JudgeOnline/problem.php?id=1176

在写这题的时候思维非常逗啊。。。。。。。。2333。。。。。。。。。。。。。。。。。。。

最后不得不去看别人的代码。。

噗,,我怎么没想到二维前缀和。。。。。。。。。。。。。。。。。。。。

orz zyf

那么对于一个矩形,我们拆成四个点,那么就可以和add操作一起cdq分治!

orz

cdq分治的话很好想的:

定义$solve(l, r)$表示用l~mid来更新mid+1~r。

考虑如何$O(n)$更新:

首先我们可以先考虑x轴,如果是已经排序好了的话,直接扫过去更新y轴!这点利用了单调的思想。

而如何更新y轴呢?树状数组。

而拆点后如何维护二维前缀和呢?加加减减。

如何快速排序呢?在外边先排序过。

然后完了。

我之前写的cdq非常逗啊,,都没有拆点,直接单调队列暴力扫,但是为啥wa了?我对拍的时候看了一下答案,只有一些答案错了QAQ。。。

一些技巧请看代码,orz

(丧心病狂の加速,我们离散y轴再用bit维护233)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <string>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <set>
  9. #include <map>
  10. using namespace std;
  11. typedef long long ll;
  12. #define rep(i, n) for(int i=0; i<(n); ++i)
  13. #define for1(i,a,n) for(int i=(a);i<=(n);++i)
  14. #define for2(i,a,n) for(int i=(a);i<(n);++i)
  15. #define for3(i,a,n) for(int i=(a);i>=(n);--i)
  16. #define for4(i,a,n) for(int i=(a);i>(n);--i)
  17. #define CC(i,a) memset(i,a,sizeof(i))
  18. #define read(a) a=getint()
  19. #define print(a) printf("%d", a)
  20. #define dbg(x) cout << (#x) << " = " << (x) << endl
  21. #define error(x) (!(x)?puts("error"):0)
  22. #define rdm(x, i) for(int i=ihead[x]; i; i=e[i].next)
  23. inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
  24.  
  25. const int N=170005, M=2000005;
  26.  
  27. int tot, c[M];
  28. inline void add(int x, const int &s) { for(; x<=tot; x+=x&-x) c[x]+=s; }
  29. inline int sum(int x) { int ret=0; for(; x; x-=x&-x) ret+=c[x]; return ret; }
  30.  
  31. int y[N*4], W, n, cnt, ans[N], S;
  32.  
  33. struct dat { int x, y, id, pos, a; bool f; }p[N*5], t[N*5];
  34. inline const bool cmp(const dat &a, const dat &b) { return a.x==b.x ? (a.y==b.y?a.pos<b.pos:a.y<b.y) : a.x<b.x; }
  35.  
  36. void cdq(int l, int r) {
  37. if(l==r) return;
  38. int mid=(l+r)>>1, l1=l, l2=mid+1;
  39. for1(i, l, r) {
  40. if(p[i].id<=mid && !p[i].f) add(p[i].y, p[i].a);
  41. if(p[i].id>mid && p[i].f) ans[p[i].pos]+=p[i].a*sum(p[i].y);
  42. }
  43. for1(i, l, r) if(p[i].id<=mid && !p[i].f) add(p[i].y, -p[i].a);
  44. for1(i, l, r) if(p[i].id<=mid) t[l1++]=p[i]; else t[l2++]=p[i];
  45. for1(i, l, r) p[i]=t[i];
  46. cdq(l, mid); cdq(mid+1, r);
  47. }
  48.  
  49. int main() {
  50. read(S); read(W);
  51. int t=getint();
  52. while(t!=3) {
  53. if(t==1) { ++n; read(p[n].x); read(p[n].y); read(p[n].a); p[n].f=0; p[n].pos=0; p[n].id=n; y[++tot]=p[n].y; }
  54. else {
  55. int x1=getint(), y1=getint(), x2=getint(), y2=getint();
  56. ans[++cnt]=S*(x2-x1+1)*(y2-y1+1);
  57. p[++n].x=x1-1, p[n].y=y1-1, p[n].f=1, p[n].a=1; p[n].id=n; p[n].pos=cnt;
  58. p[++n].x=x1-1, p[n].y=y2, p[n].f=1, p[n].a=-1; p[n].id=n; p[n].pos=cnt;
  59. p[++n].x=x2, p[n].y=y1-1, p[n].f=1, p[n].a=-1; p[n].id=n; p[n].pos=cnt;
  60. p[++n].x=x2, p[n].y=y2, p[n].f=1, p[n].a=1; p[n].id=n; p[n].pos=cnt;
  61. y[++tot]=y1; y[++tot]=y2; y[++tot]=y1-1; y[++tot]=y2-1;
  62. }
  63. read(t);
  64. }
  65. sort(y+1, y+1+tot); tot=unique(y+1, y+1+tot)-y-1;
  66. for1(i, 1, n) p[i].y=lower_bound(y+1, y+1+tot, p[i].y)-y;
  67. sort(p+1, p+1+n, cmp);
  68. cdq(1, n);
  69. for1(i, 1, cnt) printf("%d\n", ans[i]);
  70.  
  71. return 0;
  72. }

  


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范围

Source

【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 ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  5. BZOJ 1176: [Balkan2007]Mokia

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

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

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

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

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

  8. BZOJ1176: [Balkan2007]Mokia CDQ分治

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

  9. BZOJ 1176: [Balkan2007]Mokia KDtree

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

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

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

随机推荐

  1. taro 打包微信小程序运行失败(二)

    1.报错信息 thirdScriptError sdk uncaught third Error Cannot read property 'dispatch' of null TypeError: ...

  2. 去除Odoo主页中的提示: Your Odoo is not supported.

    来自 有两种方法可Odoo主页中的提示: Your Odoo is not supported. 方法1 - 修改源码 打开\addons\mail\static\src\js目录下的mail.js, ...

  3. ffmpeg Win8移植记(一)

    最近和同事一起合作,移植ffmepg到Win8平台上. Windows Store 要求3个架构X86 X64 ARM, 我们主要做的就是X86和ARM的平台, X86的平台移植的文章已经很多了.我推 ...

  4. windows合并文件夹窗口

      windows合并文件夹窗口 CreateTime--2017年7月26日16:28:14Author:Marydon 右击任务栏-->属性-->任务栏按钮选项-->选择“始终合 ...

  5. 【linux】查看内存和CPU使用情况

    1.内存命令:free 解释:以上数据单位KB. 所以,上面的mem物理内存共1G 下面是对这些数值的解释: total:总计物理内存的大小. used:已使用多大. free:可用有多少. Shar ...

  6. 【小程序】微信小程序之地图功能

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/55004841 基本使用 地图组件使用起来也很简单. .wxml <map id= ...

  7. oracle导出数据库dmp文件

    导出数据库为dmp文件,按照当前导出时间设置文件名称 @ECHO OFF ECHO 备份 SCOTT 用户的数据…… SET DBUserName=scott SET DBPassword= SET ...

  8. 查看nginx的版本

    查看nginx的版本 -v 显示 nginx 的版本-V 显示 nginx 的版本,编译器版本和配置参数 # /app/nginx/sbin/nginx -v nginx version: nginx ...

  9. 小程序 wx.request ajax示例

    简单示例 https://developers.weixin.qq.com/miniprogram/dev/api/network-request.html wx.request({ method: ...

  10. js与php中一些相似函数的对比

    一:substr js中:stringObject.substr(start,length)   一个中文算一个字符,一个英文也算一个字符 <script type="text/jav ...