才发现扫描线可以用树状数组搞... 致远星患者

(另外根据这篇博文的内容怎么越来越感觉自己往 PJ 入门靠拢了...)

还有一点,咱把树状数组当做线段树来康的话其实一切都会很清晰,这个来张四合一的图:

第一张就是随处可见的 sb 树状数组剖析图了

第二张咱把点补齐了一下,即每个点下面所有层都赋值一份点,然后以第一张图类似的规则连边,同时某个点正下方的点也要向其连边

第三张咱把点长补全了,看起来... 是不是很像线段树了呢? 2333

然后第四张图写了一下某个点 update 时的虚拟状况,某个点一直往上跑就好辣,至于 query 时,类比线段树查询 1~x 内的信息(也就是前缀信息嘛),把查询点对应到这里,不就变成了每次去掉一个 lowbit 嘛

这样,对于受众较少的 OI 龄较大但对于树状数组只是几个模板的(指自己) OIer 们来说,这篇博文的价值大部分就已经完成了...

那么还有一小部分就是树状数组(在理解了以上内容之后),在扫描线中的应用 ...

你可能已经在挠头了??? 线段树不是区间查询搞的扫描线?? 什么时候树状数组也能来凑热闹了?

脑补一下,拆成两个前缀和可不就是区间嘛, 但其实,树状数组不能艹扫描线 【雾 (就算能咱也不会啊 QwQ)

不过在这里,还有一个另一种情况的(伪)扫描线可以用树状数组优化二维前缀和来做

eg

询问 单个矩阵 与 多个矩形(互不相交,划重点) 的面积交之和 , 多组询问 ,资瓷离线 ,要求复杂度一只 log ,并且略略卡常(虽说原题时限给了 10 S 就是了)

数据比较友好,不需要离散... (讲道理可能 PJ 的同学倒能一眼看出二维前缀和,然后想着用 BIT 优化??? 虽说还是很超纲就是了)

Code

真 tm 好打,明明用线段树维护的话会是个码农题的说,用了树状数组多在纸上比划两下就好了

  1. //by Judge
  2. #include<bits/stdc++.h>
  3. #define ll long long
  4. #define Rg register
  5. #define pb push_back
  6. #define P pair<int,int>
  7. #define fi first
  8. #define se second
  9. #define fp(i,a,b) for(Rg int i(a),I=(b)+1;i<I;++i)
  10. #define fd(i,a,b) for(Rg int i(a),I=(b)-1;i>I;--i)
  11. #define go(u) for(Rg int i=head[u],v=e[i].to;i;v=e[i=e[i].nxt].to)
  12. #define open(S) freopen(S".in","r",stdin),freopen(S".out","w",stdout)
  13. using namespace std;
  14. const int M=2e6+3;
  15. typedef ll arr[M];
  16. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  17. char buf[1<<21],*p1=buf,*p2=buf;
  18. inline int read(){ int x=0,f=1; char c=getchar();
  19. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  20. for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
  21. } char sr[1<<21],z[20];int CCF=-1,Z;
  22. inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
  23. inline void print(ll x,char chr='\n'){
  24. if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
  25. while(z[++Z]=x%10+48,x/=10);
  26. while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
  27. } int n,m,W,L; ll ans[M]; vector<P> ql[M],qr[M],op[M];
  28. namespace BIT {
  29. arr f,fx,fy,fs;
  30. #define lowbit(x) (x&-x)
  31. inline void add(int x,int l,int r,ll s,int v) { ++x;
  32. while(x<=L+1) f[x]+=v,fx[x]+=v*l,fy[x]+=v*r,fs[x]+=v*s,x+=lowbit(x);
  33. }
  34. inline ll ask(int x,int l,int r) { ll sx=0,sy=0,s=0,ct=0; ++x;
  35. while(x) ct+=f[x],sx+=fx[x],sy+=fy[x],s+=fs[x],x^=lowbit(x);
  36. return ct*l*r-l*sy-r*sx+s;
  37. }
  38. } using namespace BIT;
  39. signed main() { open("intersec"); int a,b,c,d;
  40. n=read(),m=read(),W=read(),L=read();
  41. fp(i,1,n) a=read(),b=read(),c=read(),d=read(),
  42. op[a].pb(P(b,1)),op[a].pb(P(d,-1)),op[c].pb(P(b,-1)),op[c].pb(P(d,1));
  43. fp(i,1,m) a=read(),b=read(),c=read(),d=read(),
  44. ql[a].pb(P(d,i)),qr[a].pb(P(b,i)),ql[c].pb(P(b,i)),qr[c].pb(P(d,i));
  45. fp(i,0,W) {
  46. for(auto x: qr[i]) ans[x.se]+=ask(x.fi,i,x.fi);
  47. for(auto x: ql[i]) ans[x.se]-=ask(x.fi,i,x.fi);
  48. for(auto x: op[i]) add(x.fi,i,x.fi,1ll*i*x.fi,x.se);
  49. } fp(i,1,m) print(ans[i],"\n "[i<m]); return Ot(),0;
  50. }

inline void 树状数组神奇感悟【雾的更多相关文章

  1. HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)

    树状数组... Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/6 ...

  2. 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP

    3790: 神奇项链 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 304  Solved: 150[Submit][Status][Discuss] ...

  3. [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)

    世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图)         然后大力枚举每个换 ...

  4. BZOJ 3790 神奇项链(manacher+DP+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  7. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  8. HDU5126---stars (CDQ套CDQ套 树状数组)

    题意:Q次操作,三维空间内 每个星星对应一个坐标,查询以(x1,y1,z1) (x2,y2,z2)为左下顶点 .右上顶点的立方体内的星星的个数. 注意Q的范围为50000,显然离散化之后用三维BIT会 ...

  9. [luogu P3801] 红色的幻想乡 [线段树][树状数组]

    题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...

随机推荐

  1. 2-sat基础详解

    (大量引用<2-SAT解法浅析 -by 华中师大一附中 赵爽><由对称性解2-SAT问题> Great_Influence关于P4782 [模板]2-SAT 问题的题解.在此对 ...

  2. 在spring官网上下载历史版本的spring插件,springsource-tool-suite

    目前spring官网(https://spring.io/tools3/sts/all)上可下载的spring插件只有: ECLIPSE ARCHIVE SIZE 4.9.0 springsource ...

  3. JIRA7.13版本创建项目:工作流(二)

    工作流 在上一篇文章中,我们新建了一个问题类型,并且增加到问题类型方案里了,同时又关联到我们的这个项目中.那么这些问题我们需要如何设置流程走向来表示问题的处理过程呢?这就需要设定一个流程,并将这个流程 ...

  4. scala基础-1

    函数式编程 ​ 并行编程 ​ 多核计算.云计算 ​ 引用透明,给值确定,结果也确定 数据类型 三种变量修饰符 ​ val 定义immutable variable ​ var 定义mutable va ...

  5. 超全详解Java开发环境搭建

    摘自:https://www.cnblogs.com/wangjiming/p/11278577.html 超全详解Java开发环境搭建   在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必 ...

  6. 从setContentView()源码看起

    2.1 Activity::setContentView() public void setContentView(@LayoutRes int layoutResID) { getWindow(). ...

  7. mysql 查询每个分组的前几名

    按分组排序,并查出每个分组的前3名 单表 SELECT * FROM ( SELECT ZONEID, uid, NAME, fight, IF ( , ) AS rank, ( @zone := z ...

  8. java期末课程总结

    期末课程总结 转眼间,这个学期就要过去了,我们Java的学习也接近了尾声,回想到这个学期刚开始接触到Java的时候,感觉什么都不懂,但现在似乎有了门路,不会载懵懵懂懂, 虽然本学期面向对象与Java程 ...

  9. 微信小程序底部菜单栏的使用方法

    1.找到项目根目录的配置文件 app.json,在配置文件中加入配置代码.例如: "tabBar": { <!--底部的导航配置属性--> "color&qu ...

  10. vue2.0 父子组件之间的通信问题

    概要: 父组件向子组件通信:props属性 子组件向父组件通信:$emit()触发事件,$on()监听事件 在 vue 1.0 中可以使用$dispatch 和 $broadcast来实现 向上派发事 ...