Description

GFS打算去郊外建所别墅,享受生活,于是他耗费巨资买下了一块风水宝地,但令他震惊的是,一群DSJ对GFS的富贵生活深恶痛绝,决定打洞以搞破坏。
现在我们简化一下这个问题,在这片土地上会按顺序发生一系列事件。
①一只DSJ在(x,y) 这个点打了一个洞。
②有着高雅品味GFS想建一个等腰直角三角形的别墅,即由(x,y) ,(x+d,y) ,(x,y+d) 三点围成的三角形,但为了地基的牢固,他想知道当前这块三角形土地内的洞的个数。
GFS现在对DSJ已经忍无可忍了,请你帮他回答这些询问。
初始土地上没有洞。GFS毕竟是GFS,你可以认为土地无限大。

Input

第一行一个整数 n,表示事件数。接下来n行,每行3个非负整数x ,y ,d 。
d=0 表示DSJ打洞的事件。否则表示GFS建房的询问。

Output

对每个询问输出一个整数,表示当时询问的三角形内的洞的个数。

Sample Input

输入1:81 3 01 5 03 6 04 4 02 6 01 5 31 5 41 1 1输入2:41 5 03 7 02 5 62 3 4

Sample Output

输出1:330输出2:10

Data Constraint

30%的数据n<=3333 。
另30% 的数据 GFS只会在DSJ打完洞后才开始询问,xi,yi<=333333 。
100%的数据 1<=n<=88888,xi,yi<=3333333 。

题解

  • 四维偏序问题,cdq分治,再用树状数组记录一个前缀和

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 struct edge { int x,y,z,d; }a[900000],b[900000],c1[90000],c2[900000];
 6 int sz[40000000],ans[900000],tot,num,mx,n,x,y,d;
 7 bool cmp(edge x,edge y) { return x.z<y.z||(x.z==y.z&&x.d<y.d); }
 8 bool cmp1(edge x,edge y) { return x.x<=y.x; }
 9 int lowbit(int x) { return x&-x; }
10 void insert(int x,int y)
11 {
12     num=num+y;
13     for (x;x<=mx;x+=lowbit(x)) sz[x]+=y;
14 }
15 int getsum(int x)
16 {
17     int k=num;
18     for (x;x;x-=lowbit(x)) k-=sz[x];
19     return k;
20 }
21 void work(int l,int r)
22 {
23     if (l==r) return;
24     int mid=(l+r)/2,cnt1=0,cnt2=0;
25     work(l,mid),work(mid+1,r);
26     for (int i=l;i<=mid;i++) if (!b[i].d) c1[++cnt1]=b[i];
27     for (int i=mid+1;i<=r;i++) if (b[i].d) c2[++cnt2]=b[i];
28     if (!cnt1||!cnt2) return;
29     sort(c1+1,c1+cnt1+1,cmp1),sort(c2+1,c2+cnt2+1,cmp1);
30     int k=cnt1+1;
31     for (int i=cnt2;i>=1;i--)
32     {
33         while (k>1&&c1[k-1].x>=c2[i].x) insert(c1[--k].y,1);
34         ans[c2[i].d]+=getsum(c2[i].y-1);
35     }
36     for (int i=k;i<=cnt1;i++) insert(c1[i].y,-1);
37 }
38 void cdq(int l,int r)
39 {
40     if (l==r) return;
41     int mid=(l+r)/2;
42     cdq(l,mid),cdq(mid+1,r);
43     int cnt=0,boo=0;
44     for (int i=l;i<=mid;i++) if (!a[i].d) b[++cnt]=a[i];
45     for (int i=mid+1;i<=r;i++) if (a[i].d) b[++cnt]=a[i],boo=1;
46     if (!boo||!cnt) return;
47     sort(b+1,b+cnt+1,cmp),work(1,cnt);
48 }
49 int main()
50 {
51     scanf("%d",&n);
52     for (int i=1;i<=n;i++)
53     {
54         scanf("%d%d%d",&x,&y,&d);
55         a[i].x=x+1,a[i].y=y+1,a[i].z=x+y+d,mx=max(mx,y+d);
56         if (d!=0) a[i].d=++tot;
57     }
58     cdq(1,n);
59     for (int i=1;i<=tot;i++) printf("%d\n",ans[i]);
60 }

转载于:https://www.cnblogs.com/Comfortable/p/9511907.html

[cdq分治][树状数组] Jzoj P4419 hole相关推荐

  1. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  2. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  3. [cdq分治][树状数组] Bzoj P3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

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

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

  5. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  6. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

  7. hdu_5324_Boring Class(cdq分治+树状数组)

    题目链接:hdu_5324_Boring Class 题意: 给出n个二维点对,求LIS长度和编号字典序最小的LIS(x非增,y非减) 题解: dp[i]=max(dp[j]) (i>j,l[i ...

  8. Educational Codeforces Round 17 E. Radio stations cdq分治 + 树状数组

    传送门 文章目录 题意 思路: 题意 有nnn个电台,对于每个电台iii有三个参数xi,ri,fix_i,r_i,f_ixi​,ri​,fi​,分别指他们的坐标.作用半径.频率.如果两个电台频率差值在 ...

  9. P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3157 题目大意 一个长度为nnn序列,每次删除一个数,求删除前的逆序对数量. 解题思路 时光倒流之后,我们变为每 ...

最新文章

  1. 配置虚拟主机 和 打war包
  2. android-数据库SQLite相关
  3. C++模版和C#泛型求同存异录(一)sizeof(T)
  4. plt.savefig 不保存边框_Matlab科研绘图 amp; 保存
  5. streamset 数据合并_StreamSet之数据流从JDBC到Hbase
  6. c#打开数据库连接池的工作机制_它是谁?一个比 c3p0 快 200 倍的数据库连接池!...
  7. 如何将原图和json融合_用 base64 进行图片和字符串互转,并保存至 json
  8. C 线性表的链式存储实现及插入、删除等操作示例
  9. 【干货】前端开发VUE实例
  10. VScode:禁止VScode自动升级
  11. PhpStorm设置格式化代码快捷键
  12. 计算机图形学2-Liang-Barsky直线裁剪算法
  13. 压缩包文件的解压密码如何破解
  14. 磅、号、ppi、dpi、字号和分辨率关系
  15. 跟着陶哲轩学数学 目录
  16. 两台windows电脑通过以太网互ping
  17. 2019 SIGGRAPH paper
  18. 迁移过程中出现报错:无法解析的成员访问表达式[USERENV]
  19. 以亲身经历解读经典的定律或法则
  20. PPT配色的实用小技巧分享

热门文章

  1. 云计算未来趋势预测:AIaaS、无服务器、云端一体化等将成重点?
  2. sqlserver添加默认值
  3. 遍历List过程中同时修改
  4. Java最大公约数和最小公倍数的求法(辗转相除法)
  5. Python中什么是set
  6. JQUERY操作html--获取和设置内容、属性、回调函数
  7. 20145219 《信息安全系统设计基础》第01周学习总结
  8. iOS:Cocoa编码规范 -[译]Coding Guidelines for Cocoa
  9. Web控件TreeView展开无闪烁的两个解决方法
  10. android 仿qq it蓝豹,《IT蓝豹》listview实现各种版面设计功能